复制元素的所有属性[不仅是属性的值,还有整个属性列表]

  • 本文关键字:属性 列表 元素 复制 xml xslt xslt-1.0
  • 更新时间 :
  • 英文 :


我有一个场景,我想从输入XML中的XML标记复制所有属性,包括名称空间[这里我指的是整个属性列表和名称空间列表,而不仅仅是属性的值]。

为例:

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<enricher>
    <result>
        <xbrl xmlns="http://www.xbrl.org/2003/instance" 
        xmlns:idp-com="http://www.dnb.com/IDP/Common/Vers1" 
        xmlns:idp-enumcom="http://www.dnb.com/IDP/Common/Enumeration/Common/Vers1" 
        xsi:schemaLocation="http://www.dnb.com/IDP/Product/Common/Vers1 ../Common/ProductCommonTaxonomy.xsd 
        http://www.dnb.com/IDP/Common/Vers1 ../../Data/Common/CommonTaxonomy.xsd">
            <context id="defaultI">
                <entity>
                    <identifier scheme="http://www.dnb.com">Text</identifier>
                </entity>
                <period>
                    <instant>2000-07-14</instant>
                </period>
            </context>
        </xbrl>
    </result>
</enricher>
输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<enricher>
    <result>
        <xbrlresp xmlns="http://www.xbrl.org/2003/instance" 
        xmlns:idp-com="http://www.dnb.com/IDP/Common/Vers1" 
        xmlns:idp-enumcom="http://www.dnb.com/IDP/Common/Enumeration/Common/Vers1" 
        xsi:schemaLocation="http://www.dnb.com/IDP/Product/Common/Vers1 ../Common/ProductCommonTaxonomy.xsd 
        http://www.dnb.com/IDP/Common/Vers1 ../../Data/Common/CommonTaxonomy.xsd">
            <context id="defaultI">
                <entity>
                    <identifier scheme="http://www.dnb.com">Text</identifier>
                </entity>
                <period>
                    <instant>2000-07-14</instant>
                </period>
            </context>
        </xbrlresp>
    </result>
</enricher>

输出应该具有<xbrlresp>标记,其中包含<xbrl>的所有名称空间和属性。

EDIT:在您发现实际问题之后,我也更改了样式表。同样,您的输入不是格式良好的XML,因为没有定义名称空间:

`xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

XML输入

<enricher>
    <result>
        <xbrl xmlns="http://www.xbrl.org/2003/instance"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:idp-com="http://www.dnb.com/IDP/Common/Vers1" 
        xmlns:idp-enumcom="http://www.dnb.com/IDP/Common/Enumeration/Common/Vers1" 
        xsi:schemaLocation="http://www.dnb.com/IDP/Product/Common/Vers1 ../Common/ProductCommonTaxonomy.xsd 
        http://www.dnb.com/IDP/Common/Vers1 ../../Data/Common/CommonTaxonomy.xsd">
            <context id="defaultI">
                <entity>
                    <identifier scheme="http://www.dnb.com">Text</identifier>
                </entity>
                <period>
                    <instant>2000-07-14</instant>
                </period>
            </context>
        </xbrl>
    </result>
</enricher>
XSLT样式表

样式表是一个简单的标识转换,但有一个例外,即用一个新元素替换xbrl元素。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:xb="http://www.xbrl.org/2003/instance">
    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="xb:xbrl">
      <xsl:element name="xbrlresp" namespace="http://www.xbrl.org/2003/instance">
        <xsl:apply-templates select="@*|node()"/>
      </xsl:element>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<enricher>
   <result>
      <xbrlresp xmlns="http://www.xbrl.org/2003/instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dnb.com/IDP/Product/Common/Vers1 ../Common/ProductCommonTaxonomy.xsd          http://www.dnb.com/IDP/Common/Vers1 ../../Data/Common/CommonTaxonomy.xsd">
         <context xmlns="http://www.xbrl.org/2003/instance" xmlns:idp-com="http://www.dnb.com/IDP/Common/Vers1" xmlns:idp-enumcom="http://www.dnb.com/IDP/Common/Enumeration/Common/Vers1" id="defaultI">
            <entity>
               <identifier scheme="http://www.dnb.com">Text</identifier>
            </entity>
            <period>
               <instant>2000-07-14</instant>
            </period>
         </context>
      </xbrlresp>
   </result>
</enricher>

扩展Matthias的答案,如果出于美观的原因,您希望将xbrl元素的名称空间声明复制到您正在创建的新元素上,您可以使用

完成此操作
<xsl:template match="xb:xbrl">
  <xsl:element name="xbrlresp" namespace="http://www.xbrl.org/2003/instance">
    <xsl:copy-of select="namespace::*" />
    <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

copy-of名称空间节点从输入的xbrl元素复制到生成的xbrlresp上,这应该会导致序列化程序添加名称空间声明。

相关内容

  • 没有找到相关文章

最新更新