搜索XML(XPATH/XSLT)以';排名';
我想搜索XML并返回返回的搜索编号。 例如在下面的列表中搜索“orange”,我想返回6搜索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> <
<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,感谢您提供的全面答案。