【问题标题】:XML namespace handling in xsltxslt 中的 XML 命名空间处理
【发布时间】: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>

【问题讨论】:

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

标签: xml xslt namespaces


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2014-05-31
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2011-05-14
      • 2012-07-01
      相关资源
      最近更新 更多