我有一个场景,我希望从输入XML中的XML标签复制所有属性,包括名称空间[这里我指的是整个属性列表和名称空间列表,而不仅仅是属性的值]。
对于Ex:
输入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>
的所有名称空间和属性。
答案 0 :(得分:1)
编辑:在您发现实际问题后,我也更改了样式表。同样,您的输入不是格式良好的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>
答案 1 :(得分:1)
扩展the answer from 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
,这应该会导致序列化程序添加命名空间声明。< / p>