使用xslt过滤XML

时间:2014-11-18 16:12:16

标签: xml xslt

我有一个xml,想要过滤掉我不需要的部分。这是xml&各自的预期结果,

    <CD>
  <RT></RT>
  <author></author>
  <component>
    <structurebody>
      <component>
        <section>
          <templateid root = "1" />
        </section>
        </component>
        <component>
          <section>
            <templateid root = "2" />
          </section>
        </component>
        <component>
          <section>
            <templateid root = "3" />
          </section>
          </component>
        </structurebody>
    </component>
  </CD>

我希望输出包含模板ID为1和3而不是2的部分。我正在尝试以下xslt但它不起作用。它输出一切。不确定有什么问题

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

 <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
  </xsl:template>

  <xsl:template match="/component/structuredBody/component/section/templateId[not(@root = '1' or @root = '3')]" />
</xsl:stylesheet>

任何人都可以让我知道我在哪里弄错了吗?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

试试这个......

<xsl:template match="/CD/component/structuredBody/component/section[templateId[not(@root = '1' or @root = '3')]]" />

请注意xpath中的初始/CD。另请注意,此匹配section而不是templateId(假设您要删除section元素,而不仅仅是子template

实际上,你可以简化它。这里不一定要指定整个层次结构。

<xsl:template match="section[templateId[not(@root = '1' or @root = '3')]]" />