Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 获取元素位置()_Xml_Xslt_Position - Fatal编程技术网

Xml 获取元素位置()

Xml 获取元素位置(),xml,xslt,position,Xml,Xslt,Position,假设您有一个xml文档,如 <parents> <parent> <element /> <element /> </parent> <parent> <element /> <element /> </parent> </parents> 在处理过程中,我需要知道元素是文档中

假设您有一个xml文档,如

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

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

谢谢, -c

使用

这一转变:

<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>

产生想要的结果

<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.
2.
3.
4.
使用

这一转变:

<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>

产生想要的结果

<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.
2.
3.
4.

明白了,其实很简单

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

明白了,其实很简单

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


问得好,+1。请参阅我的答案,以了解完整且真正的XSLT解决方案。:)好问题,+1。请参阅我的答案,以了解完整且真正的XSLT解决方案。:)如果一个
包含另一个
@Dimitre Novatchev,这将是不正确的,在我的情况下不会,但我在我的代码中使用了你的解决方案。+1另一种方法。对于嵌套的
元素
可以使用:
计数(previous::element |祖先::element)
。但是,请注意,对于复杂的层次结构限制(不是从整个树而是从某个祖先计算),表达式可能会变得非常复杂。因为这是xsl:number/@level和xsl:number//@from。如果一个
包含另一个
@Dimitre Novatchev,这将是不正确的。在我的情况下,它不会,但我在我的代码中使用了您的解决方案。+1另一种方法。对于嵌套的
元素
可以使用:
计数(previous::element |祖先::element)
。但是,请注意,对于复杂的层次结构限制(不是从整个树而是从某个祖先计算),表达式可能会变得非常复杂。这就是xsl:number/@level和xsl:number/@from。