2010-10-27 128 views
1

比方说你有一个像获取元素位置()不考虑父

<parents> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
</parents> 

XML文档在处理时我需要知道的是,元素是1, 2, 3, 4在文档中,而不是但调用position()将返回1, 2, 1, 2。通常我会修改xml,但在这种情况下,这是不可能的,当我处理父项2时,我需要知道它是第一个元素,实际上是元素3

感谢, -c

+0

问得好,+1。查看我的答案以获得完整而真正的XSLT解决方案。 :) – 2010-10-27 16:13:17

回答

4

使用<xsl:number>

这种转变:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:number level="any" count="element"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<parents> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
</parents> 

产生通缉的结果

<parents> 
    <parent> 
     <element>1</element> 
     <element>2</element> 
    </parent> 
    <parent> 
     <element>3</element> 
     <element>4</element> 
    </parent> 
</parents> 
+1

+1很好的答案。 – 2010-10-27 19:44:25

1

得到它,它实际上很简单

<xsl:value-of select="count(preceding::element)"/> 
+0

这不会是正确的,如果一个''包含另一个'' 2010-10-27 17:05:16

+0

@Dimitre Novatchev,在我的处境也不会,但我在我的代码中使用您的解决方案进不去。 – CaffGeek 2010-10-27 18:57:15

+0

+1另一种方法。对于嵌套'元素',你可以使用:'count(之前::元素|祖先::元素)'。但是,请注意,对于复杂的层次限制(不是从整棵树而是从某个祖先开始计算),表达式可能会变得非常复杂。这是xsl:number/@ level和xsl:number/@ from。 – 2010-10-27 19:49:38