xslt - 如何基于与正在搜索的树中的属性同名的属性,在循环中获取带有xpath的XML节点?

标签 xslt xpath

我真的不能说得更好,所以我将举一个例子:

XML:

<root>
  <foo>
    <bar id="1">sdf</bar>
    <bar id="2">sdooo</bar
  </foo>
  <feng>
    <heppa id="4">hihi</heppa>
    <heppa id="2">sseeapeea</heppa>
    <heppa id="1">....</heppa>
  </feng>
</root>


XSLT:

<xsl:for-each select="/root/foo/bar">
  <p>
    <xsl:value-of select="." />: <xsl:value-of select="/root/feng/heppa[@id = @id]" />
  </p>
</xsl:for-each>


所需的输出:

<p>sdf: ....</p>
<p>sdooo: sseeapeea</p>


实际输出:

<p>sdf: hihi</p>
<p>sdooo: hihi</p>

最佳答案

仅使用XPath 1.0选择节点,您需要进行节点集比较:

/root/feng/heppa[@id=/root/foo/bar/@id]


当然,这具有NxM的复杂性(与其他XSLT解决方案一样)

在XSLT 1.0中,您应该使用键,因为存在交叉引用:

<xsl:key name="kBarById" select="bar" use="@id"/>

<xsl:template match="/root/feng/heppa[key('kBarById',@id)]">       
    <p>       
        <xsl:value-of select="concat(key('kBarById',@id),': ',.)"/>
    </p>       
</xsl:template> 

关于xslt - 如何基于与正在搜索的树中的属性同名的属性,在循环中获取带有xpath的XML节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863714/

相关文章:

XSLT 将模板应用于子集

xslt - 计算每个节点的 Strahler 数

html - 创建和理解 XML 转换

selenium - 如何使用Selenium2Library使用Robot Framework计算表中td/tr的数量

html - 获取所有节点的 XPATH

xml - 当前节点和下一个节点之间具有特定标记名的匹配节点

xml - xslt 1.0 中的拆分函数

python - lxml etree.parse.xpath() 返回仅包含制表符和换行符的项目

xmlns 声明破坏了我的 xPath 过滤器

xml - XSLT 中需要什么来添加缺失的 XML 元素?