xslt 中的 XML 命名空间处理

Posted

技术标签:

【中文标题】xslt 中的 XML 命名空间处理【英文标题】:XML namespace handling in xslt 【发布时间】:2013-04-11 02:36:35 【问题描述】:

我需要使用 xslt 将一种 xml 格式转换为另一种 xml。最初我尝试不使用命名空间并得到它。但是当我尝试使用命名空间 xmlns="http://ws.wso2.org/dataservice" 时,它在给定的 xml 文件中没有前缀作为 xmlns:d="http://ws.wso2.org/dataservice" 无法工作

<test xmlns="http://ws.wso2.org/dataservice">
 <datarows>
  <name>Name</name>
 </datarows>
 <datarows>
  <name>karthik</name>
 </datarows>
 </testcsv>

xsl转换后我需要xml文件

<head>
<names>Name</names>
<names>karthik</names>
</head>

帮助我使用 xslt

我试过 xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://ws.wso2.org/dataservice" exclude-result-prefixes="d" >
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
     <namespace-alias stylesheet-prefix="xsl" result-prefix="#default"/>


    <xsl:template match="/">
    <head>
        <xsl:for-each select="testcsv/datarows">
            <names>
                <xsl:value-of select="name" />
            </names>
        </xsl:for-each>
        </head>
    </xsl:template>
</xsl:stylesheet>

【问题讨论】:

您是否尝试搜索有关此主题的先前问题?这个问题几乎每天都会被问到,答案很容易找到。 【参考方案1】:

请更改以下列表: 1. 您的输入 XML 格式不正确。请将根元素更改为&lt;testcsv&gt; 2. 从您的 XSLT 中删除 &lt;namespace-alias stylesheet-prefix="xsl" result-prefix="#default"/&gt;,因为它不需要。 3. 在您的输入 XML 中添加命名空间 xmlns:d="http://ws.wso2.org/dataservice"

输入 XML:

<?xml version="1.0"?>
<testcsv xmlns:d="http://ws.wso2.org/dataservice">
 <datarows>
  <name>Name</name>
 </datarows>
 <datarows>
  <name>karthik</name>
 </datarows>
 </testcsv>

XSLT 转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://ws.wso2.org/dataservice" exclude-result-prefixes="d" >
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
    <head>
        <xsl:for-each select="testcsv/datarows">
            <names>
                <xsl:value-of select="name" />
            </names>
        </xsl:for-each>
        </head>
    </xsl:template>
</xsl:stylesheet>

输出:

<head>
  <names>Name</names>
  <names>karthik</names>
</head>

【讨论】:

【参考方案2】:

据我了解,您将(或不能)更改 xml 中的 xmlns 声明(可能是因为它是在其他地方生成的)。比你必须在你的 xlst 中使用 xml 节点前缀。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:d="http://ws.wso2.org/dataservice"
    exclude-result-prefixes="d"
    >
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <head>
            <xsl:for-each select="d:testcsv/d:datarows" >
                <names>
                    <xsl:value-of select="d:name" />
                </names>
            </xsl:for-each>
        </head>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

以上是关于xslt 中的 XML 命名空间处理的主要内容,如果未能解决你的问题,请参考以下文章

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误

除了使用扩展之外,如何在 XSLT 中处理自定义命名空间? [复制]

未在 XSLT 中引用默认命名空间 [重复]

重命名元素的 XSLT 问题——更改命名空间

XSLT 匹配和命名空间 [重复]