xsl:子节点中的数字

时间:2011-04-21 14:40:34

标签: xslt xpath

我的XML看起来像这样:

<A></A>
<A></A>
<A>
    <a/>
    <a/>
</A>

正如您所看到的,它有两个级别<A><a>

我编写了XSL转换,它在每个<A>元素上生成索引号并且它可以工作:

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
</xsl:attribute>
</xsl:element>
</xsl>

输出:

<Person id="1"/>
<Person id="2"/>
<Person id="3"/>

但是如何编写xsl:number以在<a>级别(???)生成相同的数字?

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="???"/>
</xsl:attribute>
</xsl:element>
</xsl>

预期输出(我希望id<Person>具有相同的<Item>

<Person id="1"/>
<Person id="2"/>
<Person id="3">
   <Item id="3"/>
   <Item id="3"/>
</Person>

我知道这必须是一些简单的XPATH表达式,但我真的很痴迷于此。

3 个答案:

答案 0 :(得分:2)

如果你真的想要相同的话,你可以简单地传递计算出的数字:

<xsl:template match="A">
  <xsl:variable name="id">
    <xsl:number count="A"/>
  </xsl:variable>
  <Person id="{$id}">
    <xsl:apply-templates select="a">
      <xsl:with-param name="pid" select="$id"/>
    </xsl:apply-templates>
  </Person>
</xsl:template>

<xsl:template match="a">
  <xsl:param name="pid"/>
  <Item id="{$pid}"/>
</xsl:template>

答案 1 :(得分:1)

好的,我有答案。但是我把Lars的答案标记为解决方案。

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="A" level="any"/>
</xsl:attribute>
</xsl:element>
</xsl>

添加level="any"属性就足够了。

答案 2 :(得分:1)

在回复您的请求而不传递变量时,请参阅下文。 缺点是<xsl:number>不能直接在属性值模板中使用(因为@Martin使用了$id变量),因此生成id属性变得冗长。

<xsl:template match="A">
  <Person>
    <xsl:attribute name="id">
      <xsl:number count="A" />
    </xsl:attribute>
    <xsl:apply-templates select="a" />
  </Person>
</xsl:template>

<xsl:template match="a">
  <Item>
    <xsl:attribute name="id"> <!-- I would name it personRef or something -->
      <xsl:number count="A" />
    </xsl:attribute>
  </Item>
</xsl:template>

(未测试)。 这里的关键是在select=".."模板中的xsl:number上使用"a"修改:事实证明select=".."实际上并不是必需的。由于上下文节点a与计数模式A不匹配,因此它从最接近它的祖先开始。什么是有用的默认网络this instruction