首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当XML上有默认名称空间时,如何使用XSLT添加带有命名空间的属性

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

Stack Overflow用户
提问于 2016-07-28 20:45:56
回答 1查看 1.2K关注 0票数 1

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

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

以下是我的XSLT:

代码语言:javascript
复制
<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根目录:

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

如果从输入XML中取出默认名称空间(这是所需的结果,除了需要保留默认名称空间),我将得到如下结果:

代码语言:javascript
复制
<?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“,但我也需要保留默认的命名空间(它可以从一个文档更改到另一个文档,我将无法控制.所以我不能把它复制过来)。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-28 21:07:35

我还需要保留默认的命名空间(它可以在文档和文档之间进行更改)。

这是一种罕见的情况,在这种情况下,传入XML的命名空间是未知的。这使您处于不利地位,因为尝试按照节点的本地名称匹配/选择节点只会很容易地匹配/选择具有相同本地名称的其他节点,但会产生不同的命名空间/s。

如果您无法避免这种情况,请尝试以下几种方法:

XSLT2.0

代码语言:javascript
复制
<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

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

其结果将是:

代码语言:javascript
复制
<?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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38646414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档