搜索XML(XPATH/XSLT)以';排名';

搜索XML(XPATH/XSLT)以';排名';,xml,xslt,xpath,Xml,Xslt,Xpath,我想搜索XML并返回返回的搜索编号。 例如在下面的列表中搜索“orange”,我想返回6 <fruits> <name>apple</name> <name>apple</name> <name>apple</name> <name>apple</name> <name>apple</name> <name>orange</name> <

我想搜索XML并返回返回的搜索编号。 例如在下面的列表中搜索“orange”,我想返回6

<fruits>
<name>apple</name>
<name>apple</name>
<name>apple</name>
<name>apple</name>
<name>apple</name>
<name>orange</name>
<name>apple</name>
<name>apple</name>
<name>apple</name>
</fruits>
我需要在输入上计算位置号

/fruits/name[$position]
,其中
$position
将是苹果中橙色的计算值)


我想某种递归模板(从搜索结果中向后走?)可以做到这一点,但我正在努力解决这个问题;也许还有另一种方法?

数一数前面的
名字
兄弟姐妹的数量:

count(/fruits/name[.='orange']/preceding-sibling::name) + 1
请注意,如果您只想直接选择该元素(基于其值),则可以简单地执行以下操作:

/fruits/name[.='orange']

但是,如果确实要返回其位置,请使用第一个表达式。

我的方法是仅将模板应用于包含搜索字符串的元素。然后仅在需要时返回带有位置谓词的路径。这样,返回的XPath将是唯一的,并且尽可能干净

XML输入

<fruits>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>orange</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
</fruits>
/fruits/name[6]
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[1]"/>
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[last()]"/>
如果搜索字符串是“apple”,它将返回每个
name
元素的路径,其中包含“apple”。如果不需要所有这些路径,可以通过更改
xsl:apply templates
返回第一个或最后一个路径

首先

<fruits>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>orange</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
</fruits>
/fruits/name[6]
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[1]"/>
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[last()]"/>

最后一次

<fruits>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
    <name>orange</name>
    <name>apple</name>
    <name>apple</name>
    <name>apple</name>
</fruits>
/fruits/name[6]
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[1]"/>
<xsl:apply-templates select="(//*[contains(text(),$search-string)])[last()]"/>

此样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">
        <xsl:variable name="position">
            <xsl:apply-templates select="fruits/name"/>
        </xsl:variable>

        <result><xsl:value-of select="$position"/></result>
    </xsl:template>

    <xsl:template match="name">
        <xsl:if test="text() = 'orange'">
            <xsl:value-of select="position()"/>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

我最喜欢这个答案:我总是忘记应用模板并将结果保存在变量中是可能的(而不是直接影响输出树)很好的干净的解决方案,谢谢。我被这个或另一个被接受的答案所束缚——既简短又有信息量。感谢您提供的xpath,感谢您提供的全面答案。