【问题标题】:How to read namespaced tag "<a:a>" from XML in XSLT?如何从 XSLT 中的 XML 读取命名空间标记“<a:a>”?
【发布时间】:2018-03-22 12:10:43
【问题描述】:

我正在尝试将 XSLT 用于下面给出的 XML -

<?xml version="1.0" encoding="UTF-8"?>
<a:catalog>
<a:cd>
    <a:title>Empire Burlesque</a:title>
    <a:artist>Bob Dylan</a:artist>
    <a:country>USA</a:country>

</a:cd>
<a:cd>
    <a:title>Hide your heart</a:title>
    <a:artist>Bonnie Tyler</a:artist>
    <a:country>UK</a:country>
</a:cd>
</a:catalog>

下面是我的 XSLT,它试图运行以获取 a:title 和 a:artist

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<body>
  <h2>My test XSLT</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">Title</th>
      <th style="text-align:left">Artist</th>
    </tr>
    <xsl:for-each select="a:catalog/a:cd">
    <tr>
      <td><xsl:value-of select="a:title"/></td>
      <td><xsl:value-of select="a:artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

在没有命名空间的情况下,我可以获得输出,但不能使用命名空间。 或者我应该写 code for remove namespaces from XML 吗?

【问题讨论】:

  • 您还需要在 XSL 中映射以 a 为前缀的命名空间。您共享的 XML 未显示任何命名空间。

标签: xml xslt xpath xslt-1.0 xslt-2.0


【解决方案1】:

您的 XML 和 XSLT 都必须声明所有正在使用的命名空间。

(不,不要编写代码来删除命名空间。命名空间在 XML 词汇表的定义和管理中发挥着重要作用。)

改为添加命名空间声明,例如

xmlns:a="http://example.com/a"

到您的 XML 和 XSLT 文件中的根元素。

请注意,在 XML 文档中使用命名空间前缀而不定义它会阻止 XML 文档成为 namespace-well-formed。

【讨论】:

  • 是的,@kjhughes,这对我有用。另一个相关的问题是,如果我有相同的 xml 格式和不同的嵌套命名空间,如下所示? 帝国滑稽剧 隐藏你的心
  • 必须声明所有使用的命名空间前缀,如本答案所示。请注意,赋予前缀含义的是与命名空间 URI 的绑定,而不是前缀本身。这意味着如果a0 和a1 都绑定到http://example.com/a,那么a0:x 和a1:x 是相同的名称。
  • 这是我必须为 xmlns:a2=" example.com/a2" xmlns:a0=" example.com/a0" xmlns:a1=" example.com/a1"
  • 在您的 XML 中也是如此。
  • 感谢您为 XML 文档 "namespace-well-formed" 提供解决方案和信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多