如果 id 没有值或重复,则不处理元素,使用 XSLT-2.0
Don't process element if id has no value or duplicated, using XSLT-2.0
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<LearningStandards>
<CoreStandardVersion>1.3</CoreStandardVersion>
<LearningStandardItem xml:lang="en" RefID="B7058B531113">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/1/</RefURI>
</LearningStandardItem>
<LearningStandardItem xml:lang="en" RefID="E2D9EF8B042C091">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/2/</RefURI>
</LearningStandardItem>
<LearningStandardItem xml:lang="en" RefID="B7058B531113">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/1/</RefURI>
</LearningStandardItem>
</LearningStandardItem>
<LearningStandardItem xml:lang="en">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/3/</RefURI>
</LearningStandardItem>
</LearningStandards>
转换 XSLT:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="LearningStandards">
<topic id="x1" xml:lang="en-US" outputclass="KKSSS-DITA">
<title>KKSSS</title>
<body>
<xsl:apply-templates/>
</body>
</topic>
</xsl:template>
<xsl:template match="CoreStandardVersion"/>
<xsl:template match="LearningStandardItem">
<bodydiv outputclass="LearningStandardItem">
<xsl:apply-templates select="@* | node()"/>
</bodydiv>
</xsl:template>
<xsl:template match="LearningStandardItem/@xml:lang"/>
<xsl:template match="@RefID">
<xsl:attribute name="id">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@RefID">
<xsl:if test=". != ''">
<xsl:attribute name="id"><xsl:value-of select="."/></xsl:attribute>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出XML
<?xml version="1.0" encoding="UTF-8"?>
<topic id="x1" xml:lang="en-US" outputclass="KKSS-DITA">
<title>KKSSS</title>
<body>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="E2D9EF8B042C091">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/2/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/3/</p>
</bodydiv>
</body>
</topic>
满足以下条件需要输出:
1) 如果ID没有值,则不处理该元素。
2) 如果 ID 是先前 <LearningStandardItem>
元素的副本,则不处理该元素。
3) 否则处理 <LearningStandardItem>
预期输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<topic id="x1" xml:lang="en-US" outputclass="KKSSS-DITA">
<title>KKSSS</title>
<body>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="E2D9EF8B042C091">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/2/</p>
</bodydiv>
</body>
</topic>
请帮助我。
您可以使用如下模板跳过没有 @RefID
或空值 @RefID
或重复 @RefID
:
的 LearningStandardItem
元素
<xsl:template match="LearningStandardItem[not(@RefID[.!='']) or preceding-sibling::LearningStandardItem[@RefID = current()/@RefID]]"/>
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<LearningStandards>
<CoreStandardVersion>1.3</CoreStandardVersion>
<LearningStandardItem xml:lang="en" RefID="B7058B531113">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/1/</RefURI>
</LearningStandardItem>
<LearningStandardItem xml:lang="en" RefID="E2D9EF8B042C091">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/2/</RefURI>
</LearningStandardItem>
<LearningStandardItem xml:lang="en" RefID="B7058B531113">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/1/</RefURI>
</LearningStandardItem>
</LearningStandardItem>
<LearningStandardItem xml:lang="en">
<RefURI>http://ramstand.org/KBL-ELvier/DDSS/L/3/</RefURI>
</LearningStandardItem>
</LearningStandards>
转换 XSLT:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="LearningStandards">
<topic id="x1" xml:lang="en-US" outputclass="KKSSS-DITA">
<title>KKSSS</title>
<body>
<xsl:apply-templates/>
</body>
</topic>
</xsl:template>
<xsl:template match="CoreStandardVersion"/>
<xsl:template match="LearningStandardItem">
<bodydiv outputclass="LearningStandardItem">
<xsl:apply-templates select="@* | node()"/>
</bodydiv>
</xsl:template>
<xsl:template match="LearningStandardItem/@xml:lang"/>
<xsl:template match="@RefID">
<xsl:attribute name="id">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@RefID">
<xsl:if test=". != ''">
<xsl:attribute name="id"><xsl:value-of select="."/></xsl:attribute>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出XML
<?xml version="1.0" encoding="UTF-8"?>
<topic id="x1" xml:lang="en-US" outputclass="KKSS-DITA">
<title>KKSSS</title>
<body>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="E2D9EF8B042C091">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/2/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/3/</p>
</bodydiv>
</body>
</topic>
满足以下条件需要输出:
1) 如果ID没有值,则不处理该元素。
2) 如果 ID 是先前 <LearningStandardItem>
元素的副本,则不处理该元素。
3) 否则处理 <LearningStandardItem>
预期输出XML:
<?xml version="1.0" encoding="UTF-8"?>
<topic id="x1" xml:lang="en-US" outputclass="KKSSS-DITA">
<title>KKSSS</title>
<body>
<bodydiv outputclass="LearningStandardItem"
id="B7058B531113">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/1/</p>
</bodydiv>
<bodydiv outputclass="LearningStandardItem"
id="E2D9EF8B042C091">
<p outputclass="RefURI">http://ramstand.org/KBL-ELvier/DDSS/L/2/</p>
</bodydiv>
</body>
</topic>
请帮助我。
您可以使用如下模板跳过没有 @RefID
或空值 @RefID
或重复 @RefID
:
LearningStandardItem
元素
<xsl:template match="LearningStandardItem[not(@RefID[.!='']) or preceding-sibling::LearningStandardItem[@RefID = current()/@RefID]]"/>