获取两个自闭元素和下一个/前一个元素的数量

时间:2015-06-11 14:55:09

标签: xml xslt xslt-2.0 saxon

<text>
    <pb n="I"/>
    <p>
        <lb/>Lorem ipsum
        <lb/>Lorem ipsum
        <lb/>Lorem ipsum
        <pb n="II"/>
        <lb/>Lorem gipsum
        <lb/>Lorem gipsum
    </p>
    <p>
        <lb/>Lorem gipsum
        <lb/>Lorem gipsum
        <pb n="III"/>
        <lb/>Lorem hipsum
        <lb/>Lorem hipsum
        <lb/>Lorem hipsum
        <lb/>Lorem hipsum
    </p>
    <pb n="IV"/>
    <p>
        <lb/>Lorem dipsum
    </p>
</text>

从这样的文件中,我想要

  1. 当给出第一个 pb @n 时,两个 pb 元素之间的所有文本和元素,
  2. pb @n 时,
  3. @n 以及 pb / @ n >被给予。
  4. 有人可以帮忙吗?我正在使用带有SaxonCE的XSLT 2.0。

    编辑:@ 2.紧随其后,紧接在前。

1 个答案:

答案 0 :(得分:1)

XPath 2.0包含运算符<<>>,因此您的第一个问题将转换为//node()[. >> $pb1 and . << $pb2](在XSLT代码中,您需要将<<转换为&lt;&lt;,例如//node()[. >> $pb1 and . &lt;&lt; $pb2])。按pb属性选择@n元素应该是显而易见的:<xsl:variable name="pb1" select="//pb[@n = 'foo']"/>。使用<xsl:key name="by-n" match="pb" use="@n"/>定义密钥<xsl:variable name="pb1" select="key('by-n', 'foo')"/>可能会更有效。

您的第二个问题可能直接转换为轴使用:$pb1/(preceding::pb | following::pb)/@n。不过我不确定你是想要找到所有前面和下面的pb,还是只想找到前面分别跟随的{。}}。