来自XPath-1.0中元素的更好的xpath

时间:2018-07-10 20:37:16

标签: xml xpath

还有另一种/更好的方法吗? 必须是这种结构,我无法更改。

<xml>
   <animal house="1">
     <home>Cat</home>
     <home>Dog</home>
     <outside>Dove</outside>
     <outside>Parrot</outside>
   </animal>
   <animal house="2">
     <home>Turtle</home>
     <home>Snake</home>
     <outside>Bee</outside>
     <outside>Horse</outside>
   </animal>
</xml>

现在我需要从所有房屋中获得家畜并加入价值观

这可行,但是我想知道是否还有其他方法可以使用xpath

http://xsltransform.net/3MEbY7g

<xsl:for-each select="./animal">
    <xsl:variable name="temp" >
        <xsl:copy-of select="./home"/>
    </xsl:variable>

    <xsl:value-of select="$temp"/>
</xsl:for-each>

2 个答案:

答案 0 :(得分:0)

仅可以使用XPath-2.0或更高版本。因此,请尝试以下XPath-2.0表达式:

string-join(for $a in /xml/animal return $a/home/text(),' - ')

其输出为

Cat - Dog - Turtle - Snake

XPath表达式的最后一部分是定界符。


在XPath-1.0中,您无法实现此目的。您可以选择的唯一设置是

/xml/animal/home

选择所有“家中动物”。

答案 1 :(得分:0)

您的代码

<xsl:for-each select="./animal">
    <xsl:variable name="temp" >
        <xsl:copy-of select="./home"/>
    </xsl:variable>

    <xsl:value-of select="$temp"/>
</xsl:for-each>

(a)非常long,而(b)在XSLT 1.0下没有产生所需的输出。

在XSLT 1.0中,您可以使用来获取所需的输出

<xsl:for-each select="animal/home">
    <xsl:value-of select="."/>
</xsl:for-each>

在XSLT 2.0中,您可以编写:

<xsl:value-of select="animal/home" separator=""/> 

使用单个XPath 2.0表达式可以实现相同的结果:

string-join(/*/animal/home, "")

但是没有等效的XPath 1.0。