当节点命名为 <foo:bar> 时,如何在 XSLT 中选择节点?

Posted

技术标签:

【中文标题】当节点命名为 <foo:bar> 时,如何在 XSLT 中选择节点?【英文标题】:How can I select nodes in XSLT when the node is named <foo:bar>? 【发布时间】:2022-01-10 20:53:46 【问题描述】:

我有一个结构如下的 XML 文件:

<Products>
 <Product>
  <sku>1234567</sku>
  <attribute:pa_brand xmlns:attribute="attribute">bugatti</attribute:pa_brand>
  <attribute_data:pa_brand xmlns:attribute_data="attribute_data">5|1|0</attribute_data:pa_brand>
 </Product>
</Products>

我正在尝试选择某个品牌的所有产品。我尝试了以下 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <Products>
      <xsl:apply-templates select="//Product[attribute:pa_brand  = 'bugatti']"/>
    </Products>
  </xsl:template>

  <xsl:template match="Product">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

在 Mac OS 上使用 XML Starlet 它给了我:无法评估“选择”表达式。

在节点名称中添加单引号: select="//Product['attribute:pa_brand' = 'bugatti']"/> 运行查询,但不返回任何结果。

在选择中使用一个简单的节点,即:'sku' 像这样://Product[sku='123456'] 工作正常。我什至不知道这个符号叫什么&lt;foo:bar&gt;&lt;/foo:bar&gt;。我不知道如何调用节点名称的“条”部分。尝试过 W3CSchools 和各种参考资料。我发现的所有示例和参考资料都只描述了简单的节点,或者具有&lt;foo&gt;&lt;/foo&gt;&lt;foo bar='baz'&gt;&lt;/foo&gt; 属性的节点。找不到任何 &lt;foo:bar&gt;baz&lt;/foo:bar&gt; 参考。

【问题讨论】:

不确定您使用什么作为测试环境。您的样式表应该会产生错误,因为 attribute 前缀未绑定到命名空间。 参考:w3.org/TR/xml-names 和 w3.org/TR/1999/REC-xpath-19991116/#node-tests。 “我什至不知道这个符号叫什么”。任何有关 XML 的书都会有关于名称空间的章节。您需要重新评估学习技术的方法:在遇到编码问题之前不要放弃对基本概念的研究。在编写一行代码之前,您需要大致了解自己在做什么。 【参考方案1】:

怎么样:

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

<xsl:template match="/Products">
    <xsl:copy>
        <xsl:copy-of select="Product[attribute:pa_brand = 'bugatti']"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

注意xsl:stylesheet 元素中的命名空间声明。

【讨论】:

我同时找到了解决方案,回来更新。我了解到符号 与命名空间有关,而 foo 在这种情况下是一个前缀 - 这有助于我搜索解决方案。我注意到 XML 元素中的 xmlns:attribute="attribute" 属性,并将其添加到 XSL 模板中的样式表声明中,正如@michael.hor257k 所建议的那样。感谢您的帮助。

以上是关于当节点命名为 <foo:bar> 时,如何在 XSLT 中选择节点?的主要内容,如果未能解决你的问题,请参考以下文章

获取对象的第一个索引

python 普通继承方式和super继承方式

jQuery速记

jquery 冒号转义 为啥双斜杠

为啥 println!(foo.bar()?) 移动 foo?

如果存在,如何重命名哈希中的键