XSL替换命名空间

时间:2014-04-25 01:26:28

标签: xslt

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:OrderChange ns0:transactionPurposeIndicator="Change" xmlns:ns0="http://www.api.org/pidXML">
<ns0:OrderChangeProperties>
<ns0:OrderChangeNumber>1</ns0:OrderChangeNumber>
<ns0:OrderChangeDate>2009-10-19</ns0:OrderChangeDate>
</ns0:OrderChangeProperties>
</ns0:OrderChange>

我需要将其转换为以下格式:

<?xml version="1.0" encoding="UTF-8"?>
<pidx:OrderChange pidx:transactionPurposeIndicator="Change"    xmlns:pidx="http://www.api.org/pidXML" xmlns="http://www.api.org/pidXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.api.org/pidXML Z:\integration\trunk\schemas\pidx\OrderChange_1-2.xsd">
<pidx:OrderChangeProperties>
<pidx:OrderChangeNumber>1</pidx:OrderChangeNumber>
<pidx:OrderChangeDate>2009-10-19</pidx:OrderChangeDate>
</pidx:OrderChangeProperties>
</pidx:OrderChange>

有人可以让我知道将进行此转换的XSL。 我已经尝试了几个XSL转换,但无法实现它。 真的很感谢所有的帮助

由于

2 个答案:

答案 0 :(得分:2)

  

我们正在使用基于云的应用程序及其要求   非常严格。他们需要格式为i的XML   上文提到的。

嗯,它应该没有任何区别。如果是,那么&#34;他们&#34;做错了。

  

另外,如果您检查要使用的标签   格式(第二个代码)它有几个&#34;命名空间&#34;定义比在   as-is(第一个代码)所以我假设我需要&#34;命名空间替换&#34;   以及

添加这些是相对简单的,与更改名称空间前缀无关。无论如何,请尝试以下方法:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://www.api.org/pidXML"
xmlns:pidx="http://www.api.org/pidXML"
exclude-result-prefixes="ns0"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="ns0:OrderChange">
    <pidx:OrderChange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.api.org/pidXML Z:\integration\trunk\schemas\pidx\OrderChange_1-2.xsd">
        <xsl:apply-templates select="@*|node()"/>
    </pidx:OrderChange>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="pidx:{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="pidx:{local-name()}">
    <xsl:value-of select="." />
</xsl:attribute>
</xsl:template>

</xsl:stylesheet>  

答案 1 :(得分:1)

如果基于云的应用程序坚持使用特定的名称空间前缀,那么您应该询问一些关于运行此服务的人员的能力的严重问题。这是非常糟糕的XML实践。

正式地说,XSLT 1.0无法控制输出中名称空间前缀的选择。它不应该重要,因此规范允许实现做他们喜欢的事情。但实际上,在几乎所有实际情况中,实际实现都将使用您在样式表中指定的前缀;在XSLT 2.0中,这已成为强制性的。所以来自@ michael.hor257k的解决方案使用

<xsl:element name="pidx:{local-name()}">

应该在实践中做到这一点,即使它没有保证。