如果 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]]"/>