XPath/XSLT如何确定上下文节点相对于所有同名节点的索引?

3

以下是给定的模式 - 以“查询”节点作为上下文,是否可以使用xpath / xslt确定该“查询”节点相对于文档中所有“查询”节点的索引(而不是相对于其直接兄弟位置())。

谢谢您,

Geoff

<section>
    <name>About</name>
    <link>about</link>
    <questions>
        <question>
            <query>Question 1</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
    </questions>
</section>

<section>
    <name>Contact</name>
    <link>contact</link>
    <questions>
        <question>
            <query>Question 1</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
        <question>
            <query>Question 2</query>
            <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
        </question>
    </questions>
</section>


好问题(+1)。有一个非常简短的一行XPath表达式可以给你想要的结果 - 请看我的答案。 :) - Dimitre Novatchev
1个回答

7

使用方法:

count(preceding::question)+1

这个转换执行了一个详尽的测试:

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

 <xsl:variable name="vQs" select="//question"/>

 <xsl:template match="/">
  <xsl:for-each select="$vQs">
    <xsl:value-of select=
    "count(preceding::question)+1"/>
    <xsl:text> </xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用上述变换于以下XML文档时:
<t>
    <section>
        <name>About</name>
        <link>about</link>
        <questions>
            <question>
                <query>Question 1</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 2</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
        </questions>
    </section>
    <section>
        <name>Contact</name>
        <link>contact</link>
        <questions>
            <question>
                <query>Question 3</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 4</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
            <question>
                <query>Question 5</query>
                <answer>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus, elit id lacinia semper, ligula nunc rhoncus ante, in euismod tortor nibh dictum tellus.</answer>
            </question>
        </questions>
    </section>
</t>

期望的结果已产生:

1 2 3 4 5 

不错!我不知道那个。肯定比我之前尝试的更容易了。 - jwismar
@jwismar,很高兴你喜欢这个答案。给个赞来表达一下吧? :) - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接