当XML上有默认命名空间时,如何使用XSLT添加带有命名空间的属性

时间:2016-07-28 20:45:56

标签: xml xslt

这是我的XML的根源(还有更多内容,但这是基础):

<?xml version="1.0" encoding="UTF-8"?><section xmlns="http://quark.com/smartcontent/2.0" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet">

这是我的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" version="2.0">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="*|@*">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="section[@id]">
      <xsl:copy>
         <xsl:attribute name="deltaxml:key" select="@id"/>
            <xsl:apply-templates select="@*, node()"/>
      </xsl:copy>
  </xsl:template>

这是输出XML根目录:

<?xml version="1.0" encoding="UTF-8"?><section xmlns="http://quark.com/smartcontent/2.0" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet">

如果我从输入XML中删除默认命名空间,这就是我得到的结果(除了我需要保留默认命名空间之外,这是期望的结果):

<?xml version="1.0" encoding="UTF-8"?><section xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1" deltaxml:key="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" type="clientFactsheet">

基本上,我需要能够添加带有“id”值的“deltaxml:key”属性,所以我需要添加命名空间“deltaxml”,但我还需要保留默认命名空间(哪个可以从一个文档更改为我无法控制的文档...所以我不能只复制它。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

  

我还需要保留默认命名空间(可以从中更改)   文件到文件

这是一种罕见的情况,其中传入XML的命名空间事先是未知的。这使您处于不利地位,因为尝试仅通过其本地名称匹配/选择节点可能很容易导致匹配/选择具有相同本地名称但位于不同名称空间中的其他节点。

如果你无法避免,请尝试以下几点:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*:section[@id]">
    <xsl:copy>
        <xsl:attribute name="deltaxml:key" select="@id"/>
        <xsl:apply-templates select="@*, node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于以下输入示例:

<强> XML

<section xmlns="http://quark.com/smartcontent/2.0" 
         id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64" 
         type="clientFactsheet">
<!-- content -->
</section>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<section xmlns="http://quark.com/smartcontent/2.0"
         xmlns:deltaxml="http://www.deltaxml.com/ns/well-formed-delta-v1"
         deltaxml:key="_63f6a0c9-bac8-4a15-854c-03d80bd46b64"
         id="_63f6a0c9-bac8-4a15-854c-03d80bd46b64"
         type="clientFactsheet"><!-- content --></section>