xslt命名空间指令导致不必要的副作用

时间:2018-04-18 15:40:58

标签: xslt-2.0

感谢其他几个问题,我正在慢慢地通过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 ...

1 个答案:

答案 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:*属性节点。