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 格式不正确。请将根元素更改为<testcsv>
2. 从您的 XSLT 中删除 <namespace-alias stylesheet-prefix="xsl" result-prefix="#default"/>
,因为它不需要。
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 解析器返回错误