感谢其他几个问题,我正在慢慢地通过xsl转换来改变我的命名空间的url。我正在使用xslt v2。
主要样本在http://xsltransform.net/ei5Pwj2
这已经开始起作用,但我有2个问题1试着让它起作用(!)和一个看看是否有可能使它更好。
首先我使用
<xsl:namespace name="ns1">http://fruit.com/app/api</xsl:namespace>
导致了一个问题,因为它导致元素中的ns1属性修改了其名称空间
... ns1:created="2016-05-23T16:47:55+01:00" ns1:href="http://falseserver:8080/app/api/apple/1" ns1:id="1">
到
... ns1_1:created="2016-05-23T16:47:55+01:00"
ns1_2:href="http://falseserver:8080/app/api/apple/1" ns1_3:id="1">
谁能告诉我为什么以及如何制止这个?我没有看到如何不添加它作为元素中的命名空间,但因为我有一个命名空间标记已经存在这是不可能的
这足以让我现在开始,但是如果有一种方法可以转换命名空间而根本没有引用该元素,那么完美的是什么。目前,如果我可以按原样运行它,我将需要一些xslt文件,用于稍微不同的文档。我真正想做的是转换命名空间,而不管当前的根节点是什么
因此,无论根元素是否为
,所有文档都将具有所有6个名称空间作为属性<ns2:apple ...
<ns2:apples ...
<ns4:banana ...
<ns4:bananas ...
等
答案 0 :(得分:1)
您需要将某个命名空间中的任何节点转换为您需要的新命名空间,添加命名空间以更改节点的限定名称(该限定名称始终为本地名称加上名称空间):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://veg.com/app/api" xmlns:ns2="http://veg.com/app/api/apple">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns2:*">
<xsl:element name="ns2:{local-name()}" namespace="http://fruit.com/app/api/apple">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/ns2:*">
<xsl:element name="ns2:{local-name()}" namespace="http://fruit.com/app/api/apple">
<xsl:namespace name="ns1">http://fruit.com/app/api</xsl:namespace>
<xsl:namespace name="ns3">http://fruit.com/app/api/apple/red</xsl:namespace>
<xsl:namespace name="ns4">http://fruit.com/app/banana</xsl:namespace>
<xsl:namespace name="ns5">http://fruit.com/app/api/pear</xsl:namespace>
<xsl:namespace name="ns6">http://fruit.com/app/api/orange</xsl:namespace>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@ns1:*">
<xsl:attribute name="ns1:{local-name()}" namespace="http://fruit.com/app/api" select="."/>
</xsl:template>
</xsl:stylesheet>
http://xsltransform.net/ei5Pwj2/1
您的示例在其他名称空间中没有节点,但如果真实代码具有此类节点并且需要进行转换,则需要添加匹配和转换它们的模板,使用与上面{{1}相同的方法元素或ns2:*
属性节点。