如何获得两个标记标签之间的所有元素?

时间:2019-03-26 07:22:09

标签: xml xslt

我有类似下面的xml。我想要开始和结束自我关闭标记标签之间的所有元素。忽略其余元素。我正试图在XSLT中做到这一点。

 <catalog>
 <cd>
    <start/>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
 </cd>
 <end/>
 </catalog>

1 个答案:

答案 0 :(得分:0)

这个想法很简单:

  • 定义rng1变量,该变量包含start之后的元素 (跟随轴)
  • 定义rng2变量,该变量包含end之前的元素 (之前的轴),
  • 将模板应用于这两个元素集的交集。

但是要获得格式正确的XML输出,模板必须生成 “信封”,例如root元素,然后生成其中的内容。

另一个细节:由于您不知道同时startend的确切XPath, XSLT代码必须从//开始指定它们。

因此整个脚本如下所示:

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

  <xsl:template match="/">
    <root>
      <xsl:variable name="rng1" select="//start/following::*"/>
      <xsl:variable name="rng2" select="//end/preceding::*"/>
      <xsl:apply-templates select="$rng1 intersect $rng2"/>
    </root>
  </xsl:template>

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