如果id没有值或重复,请使用XSLT-2.0处理元素

时间:2017-01-13 04:32:30

标签: xml xslt 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>

请帮助我。

1 个答案:

答案 0 :(得分:2)

您可以使用下面的模板跳过没有LearningStandardItem或空值@RefID或重复@RefID的{​​{1}}元素:

@RefID