基本 XML/XSLT - 存在多个同名元素时的值
Posted
技术标签:
【中文标题】基本 XML/XSLT - 存在多个同名元素时的值【英文标题】:Basic XML/XSLT - value-of when there are multiple elements of the same name 【发布时间】:2012-01-12 16:22:44 【问题描述】:当我获取在同一个父元素中多次使用的元素的值时,我想获取同名的每个元素,而不仅仅是第一个。
例如-
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<artist>Bob Dylan2</artist>
<artist>Bob Dylan3</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
现在,当我遍历每张 CD 并使用 value-of 输出艺术家姓名时,我只得到第一个元素(有点可以理解)。但是如何在 for-each 循环中获取所有同名元素?我尝试做一个内部 for-each 循环,但没有奏效。
我对 XML 及其工作原理非常陌生,所以请放轻松...:-(
【问题讨论】:
【参考方案1】:text()
xpath 语法选择当前指定节点的任何文本子节点。
有些人不是特别喜欢这个网站,但刚开始,给你指出正确的方向还不错 - click here
【讨论】:
【参考方案2】:现在当我
for-each
通过每张CD并使用value-of
输出 艺术家姓名,我只得到第一个元素(有点可以理解)。 但是如何在for-each
中获取所有同名元素 环形?我尝试做一个内部for-each
循环,但没有奏效。
我对任何 XSLT 新手的建议是 不要使用<xsl:for-each>
——尽可能使用。我知道只有一个用例需要<xsl:for-each>
,这是一种很少遇到的情况(当需要显式更改当前文档以便key()
函数将使用为此特定构建的索引时文件)。
这可能是最简单的解决方案之一(没有<xsl:for-each>
并且没有嵌套):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="artist">
<xsl:value-of select="concat(., '
')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<artist>Bob Dylan2</artist>
<artist>Bob Dylan3</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
产生想要的正确结果:
Bob Dylan
Bob Dylan2
Bob Dylan3
【讨论】:
【参考方案3】:<xsl:template match="catalog/cd/artist">
<xsl:value-of select="." />
</xsl:template>
【讨论】:
【参考方案4】:<xsl:template match="/">
<xsl:for-each select="catalog">
<!-- Print Other Stuff, if required -->
<xsl:for-each select="cd/artist">
<xsl:value-of select="text()"/><br/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
输出:
鲍勃·迪伦鲍勃·迪伦2鲍勃·迪伦3
【讨论】:
选择="。"应该优先使用 select="text()"。如果内容包含 cmets、嵌套子元素等,它会更加健壮 - 特别是如果您正在针对不连接相邻文本节点的实现运行 - 这是不符合要求的,但它会发生。 这似乎奏效了——我只需要做一个内部的 for-each 和 text()。你能告诉我 text() 函数是做什么的吗?【参考方案5】:您的 XPATH 可能是错误的:
在 CD 元素中使用 foreach 时:
<xsl:template match="/">
<xsl:for-each select="//cd">
<xsl:for-each select="artist">
<xsl:message terminate="no">
<xsl:value-of select="."/>
</xsl:message>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
打印所有艺术家..
【讨论】:
【参考方案6】:内部循环没有理由不起作用。您使用什么 XSLT 语法来执行此操作?听起来您的 xpath 或其他东西有错误,因为您所描述的应该可以正常工作。
【讨论】:
以上是关于基本 XML/XSLT - 存在多个同名元素时的值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xslt 获取 XML 的属性值和代码作为 html 的值