使用XSLT将其他命名空间/ schemalocations添加到XML文件

时间:2011-02-01 22:29:40

标签: xslt xslt-2.0 xslt-1.0

我想转换:

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd">
<p></p></ppx>

成:

<ppx xmlns="http://www.p.com/ppx/1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ppxx="http://www.m.com/mExt/v1" 
xmlns:ppxtpx="http://www.m.com/mExt/v3" 
xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
<p></p></ppx>

我需要将一些名称空间声明及其关联的schemaLocations添加到现有的XML文件中,而不更改该XML中的任何其他内容。

1 个答案:

答案 0 :(得分:1)

原则上它很容易:它只需要一个标准的“修改后的身份模板”模式:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="ppx">
<ppx xmlns="http://www.p.com/ppx/1" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:ppxx="http://www.m.com/mExt/v1" 
  xmlns:ppxtpx="http://www.m.com/mExt/v3" 
  xsi:schemaLocation="http://www.p.com/ppx/1 http://www.p.com/ppx/1/ppx.xsd 
    http://www.m.com/mExt/v1 http://www.m.com/mExt/v1/ppxv1.xsd 
    http://www.m.com/mExt/v3 http://www.m.com/mExt/v3/ppxv3.xsd">
    <xsl:apply-templates/>
  </ppx>
</xsl:template> 

但是,它可能会变得有点复杂,具体取决于输入与您向我们展示的示例有多大差异。例如,如果根元素不会始终命名为ppx,或者事先不知道要添加的命名空间。所以你可能需要解释问题的更多细节