【问题标题】:XPath Select All Attribute Name Value Pairs from Entire XML DocumentXPath 从整个 XML 文档中选择所有属性名称值对
【发布时间】:2015-08-19 17:45:17
【问题描述】:

我是 XPath 和 XML 的新手。我想知道是否有一个 XPath 表达式可以从整个 XML 文档中选择所有属性名称及其各自的值。

作为我所拥有的一个更简单的例子:

<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
            <money currency="Dollars"></money>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
            <money currency="Dollars"></money>
    </book>
    <book category="WEB">
        <title lang="en">XQuery Kick Start</title>
        <author>James McGovern</author>
        <author>Per Bothner</author>
        <author>Kurt Cagle</author>
        <author>James Linn</author>
        <author>Vaidyanathan Nagarajan</author>
        <year>2003</year>
        <price>49.99</price>
            <money currency="Euros"></money>
    </book>
        <book category="WEB">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
            <money currency="Dollars"></money>
    </book>
</bookstore>

我想要这个:

category : COOKING
lang : en
currency : Dollars

category : CHILDREN
lang : en
currency : Dollars

category : WEB
lang : en
currency : Euros

category : WEB
lang : en
currency : Dollars

问题是我希望这个表达式适用于任何 XML 文档。也欢迎任何其他关于我如何做到这一点的建议。谢谢你。

【问题讨论】:

  • 有可能......请提供示例输入和预期输出。
  • 严格来说,属性的值不是节点,不能被XPath表达式选择。但当然可以使用 XSLT 输出名称/值对列表。向我们展示(至少)预期的输出。
  • 我提供了一个更简单的例子。我的文档太大,无法共享,但目标是相同的。谢谢。
  • "我希望此表达式适用于任何 XML 文档" 在您的示例中,按书籍进行了明确的分组。这不适用于任何文档——XML远比这可扩展
  • @michael.hor257k:+1 为您提供有用的解释。然而,仅仅因为某物不是节点并不意味着它不能被 XPath 表达式“选择”(在某种意义上)。例如。 string(/*/book[1]/@category)我相信你知道这一点,但你措辞的方式可能会给不知情的人留下错误的印象。

标签: xml xslt xpath


【解决方案1】:

这将适用于您的输入(在您修复不匹配的标签 &lt;money&gt;&lt;/currency&gt;!)和其他相当相似的 XML 文档 - 但不能保证它适用于 any XML 文档:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*/*">
    <xsl:for-each select=".//@*">
        <xsl:value-of select="concat(name(), ': ', ., '&#10;')"/>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

OTOH,这适用于任何 XML - 但输出将只是整个文档中所有属性名称/值对的单个列表,没有分隔:

XSLT 1.0

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

<xsl:template match="/">
    <xsl:for-each select="//@*">
        <xsl:value-of select="concat(name(), ': ', ., '&#10;')"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

结果

category: COOKING
lang: en
currency: Dollars
category: CHILDREN
lang: en
currency: Dollars
category: WEB
lang: en
currency: Euros
category: WEB
lang: en
currency: Dollars

【讨论】:

  • 谢谢!我修正了不匹配。
  • @pseudorandom 如果您的问题得到解答,请通过接受答案将其关闭。
  • 我以前从未使用过 XLST。你如何运行它?非常感谢你。感谢您的所有帮助。
  • @pseudorandom 这与上述问题无关。我建议你发布一个新的(尽管我怀疑它会被认为是 Stack Overflow 的题外话)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多