如何在XSLT 1中选择所有兄弟节点的唯一子节点

时间:2013-10-29 20:50:29

标签: xslt xslt-1.0

我正在寻找获得所有兄弟节点的所有唯一(无重复)嵌套节点的最佳方法。我感兴趣的节点是“Gases”。兄弟节点是“内容”。我简化的XML:

<Collection>
  <Content>
    <Html>
     <root>
      <Gases>NO2</Gases>
      <Gases>CH4</Gases>
      <Gases>O2</Gases>
     </root>
    </Html>
  </Content>
  <Content>
    <Html>
     <root>
      <Gases>NO2</Gases>
      <Gases>CH4</Gases>
      <Gases>CO</Gases>
      <Gases>LEL</Gases>
      <Gases>NH3</Gases>
     </root>
    </Html>
  </Content>
</Collection>

所需结果:NO2 CH4 O2 CO LEL NH3

我是XSLT的新手,所以任何帮助都会非常感激。我一直在尝试使用XPATH,similar to here,但没有运气。

1 个答案:

答案 0 :(得分:2)

此XSLT样式表将生成所需的输出。请注意,它依赖于单个 Gases元素中没有重复的Content元素。

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

  <xsl:strip-space elements="*"/>

  <!-- Match Gases elements whose value does not appear in a Gases element inside a previous
       Content element. -->
  <xsl:template match="//Gases[not(. = ancestor::Content/preceding-sibling::Content//Gases)]">
    <xsl:value-of select="."/>
    <xsl:text> </xsl:text>
  </xsl:template>

  <!-- Need to override the built-in template for text nodes, otherwise they will still get
       printed out. -->
  <xsl:template match="text()"/>

</xsl:stylesheet>