2

我在包含树的一部分的选择属性中应用带有变量的模板。从那我称另一个应用模板具有以下兄弟::构造,但它适用于所有树。例如:

<a>
    <b id="1" ol="1" />
    <b id="2" ol="0" />
    <b id="3" ol="0" />
    <b id="4" ol="1" />
    <b id="5" ol="0" />
    <b id="6" ol="0" />
    <b id="7" ol="1" />
    <b id="8" ol="0" />
    <b id="9" ol="0" />
    <b id="10" ol="1" />
    <b id="11" ol="0" />
    <b id="12" ol="0" />
    <b id="13" ol="1" />
    <b id="14" ol="0" />
    <b id="15" ol="0" />
    <b id="16" ol="1" />
</a>

...
<xsl:variable name="part" select="b[@ol = 1] />
<xsl:apply-templates mode="top" select="$part[position() mod 3 = 1]" />
...
<xsl:template mode="top" match="*">
    <tr>
        <xsl:apply-template mode="inner" select=".|following-sibling::b[not(position() > 2)]" />
    </tr>
<xsl:template>

<xsl:template mode="inner" match="*">
    <p><xsl:value-of select="@id" /></p>
<xsl:template>

我期望的是

<tr><p>1</p><p>4</p><p>7</p></tr>
<tr><p>10</p><p>13</p><p>16</p></tr>

我有什么

<tr><p>1</p><p>2</p><p>3</p></tr>
<tr><p>10</p><p>11</p><p>12</p></tr>

那么为什么模板“top”改变上下文来完成树而不是$part同时应用follow-sibling呢?以及如何获得预期的变体?

4

2 回答 2

0

$part 选择@ol=1 的元素,即元素1,4,7,10,13,16。

$part[position() mod 3 = 1] 选择 $part 中在 $part 中位置为 1, 4, 7, ... 的项目,即选择 id 为 1 和 10 的元素。

然后将模板应用于这些,以输出以这两个开头的三个元素的组,从而为您提供组 (1,2,3) 和 (10,11,12)。

我认为您的错误可能在于想象 position() 返回树中元素的位置,而不是您正在过滤的列表中元素的位置。

于 2013-08-15T13:07:52.130 回答
0

XPath 选择输入树中的节点,它永远不会更改该输入树。所以选择一些节点不会以任何方式改变树中的结构和关系,兄弟姐妹或孩子或祖先保持不变。如果要操作树,请使用 XSLT 或 XQuery。由于您已经使用 XSLT,因此在 XSLT 1.0 中,您需要编写模板来创建具有新结构的结果树片段,然后在应用扩展函数之后,exsl:node-set您可以处理中间树。使用 XSLT 2.0,您不需要扩展功能,但需要构建中间树。

为了实现您想要的输出,您可以使用

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

<xsl:output indent="yes" method="html"/>

<xsl:template match="a">
  <xsl:variable name="part" select="b[@ol = 1]" />
  <xsl:apply-templates mode="top" select="$part[position() mod 3 = 1]" />
</xsl:template>

<xsl:template mode="top" match="*">
    <tr>
        <xsl:apply-templates mode="inner" select=".|following-sibling::b[@ol = 1][not(position() > 2)]" />
    </tr>
</xsl:template>

<xsl:template mode="inner" match="*">
    <p><xsl:value-of select="@id" /></p>
</xsl:template>

</xsl:stylesheet>

使用 XSLT 样式表 Saxon 6.5.5 转换

<a>
    <b id="1" ol="1" />
    <b id="2" ol="0" />
    <b id="3" ol="0" />
    <b id="4" ol="1" />
    <b id="5" ol="0" />
    <b id="6" ol="0" />
    <b id="7" ol="1" />
    <b id="8" ol="0" />
    <b id="9" ol="0" />
    <b id="10" ol="1" />
    <b id="11" ol="0" />
    <b id="12" ol="0" />
    <b id="13" ol="1" />
    <b id="14" ol="0" />
    <b id="15" ol="0" />
    <b id="16" ol="1" />
</a>

进入

<tr>
   <p>1</p>
   <p>4</p>
   <p>7</p>
</tr>
<tr>
   <p>10</p>
   <p>13</p>
   <p>16</p>
</tr>
于 2013-08-15T11:39:13.693 回答