XSLT - 选择以下项目直到特定标记

时间:2011-12-08 18:22:17

标签: xml xslt xpath

考虑我有这个XML文件:

<text>
  <w>John</w>
  <x>Smith</x>
  <z>Andy</z>
  <w>Goo</w>
  <w>Joseph</w>
  <y>Lee</y>
  <x>Kenny</x>
  <z>Maria</z>
  <y>Zoe</y>
  <z>Martin</z>
</text>

现在我希望选择第一 <z>第二 <z>

之间的元素

所以输出将是:

  <w>Goo</w>
  <w>Joseph</w>
  <y>Lee</y>
  <x>Kenny</x>

我所知道的是我们可以&#34;复制&#34;选择&#34;以下兄弟姐妹&#34; of&#34; z [1]&#34; 但我不知道如何在#34; z [2]&#34;

2 个答案:

答案 0 :(得分:4)

选择以下两个节点集的交集:

  • 第一个z
  • 之后的所有节点
  • 第二个z
  • 之前的所有节点

这两个集合的交集将是第一个和第二个z元素之间的所有节点。使用以下表达式:

/*/z/following-sibling::*[
    count(.|/*/z[2]/preceding-sibling::*) =
    count(/*/z[2]/preceding-sibling::*)]

注意:这使用Kayessian节点集交集公式。通常,使用以下内容查找$set1$set2的交集:

$set1[count(.|$set2)=count($set2)]

答案 1 :(得分:2)

您可以使用XPath:

text/*[preceding-sibling::z and following-sibling::z[2]]

e.g:

<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="/">
    <xsl:apply-templates select="text/*[preceding-sibling::z and following-sibling::z[2]]"/>
  </xsl:template>

</xsl:stylesheet>