我是XSLT的新手,我不知道如何完成以下任务。
下面是另一个程序生成的xbrl文档的一部分。通过XSLT,我想在评论行的位置添加一个额外的元素:
<xbrli:context id="ctx1">
[...]
</xbrli:context>
//Insert a new element here!
<bd-ob-tuple:TaxData>
[...]
</bd-ob-tuple:TaxData>
在那个位置,我想使用XSLT添加以下元素:
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
这样最终结果将是:
<xbrli:context id="ctx1">
[...]
</xbrli:context>
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
<bd-ob-tuple:TaxData>
[...]
</bd-ob-tuple:TaxData>
(xbrli:context
元素在整个文档中只有一个出现,这样可能更容易找到新元素的上述位置?)
有没有办法通过XSLT实现这个目标?
答案 0 :(得分:2)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xbrli="some:xbrli" exclude-result-prefixes="xbrli">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xbrli:context">
<xsl:call-template name="identity"/>
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR
</xbrli:measure>
</xbrli:unit>
</xsl:template>
</xsl:stylesheet>
应用于以下XML文档(清理并包装提供的文本以使其格式正确):
<t xmlns:xbrli="some:xbrli" xmlns:bd-ob-tuple="some:bd-ob-tuple">
<xbrli:context id="ctx1"> [...] </xbrli:context>
<bd-ob-tuple:TaxData> [...] </bd-ob-tuple:TaxData>
</t>
生成想要的正确结果:
<t xmlns:bd-ob-tuple="some:bd-ob-tuple" xmlns:xbrli="some:xbrli">
<xbrli:context id="ctx1"> [...] </xbrli:context>
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR
</xbrli:measure>
</xbrli:unit>
<bd-ob-tuple:TaxData> [...] </bd-ob-tuple:TaxData>
</t>
解释:使用身份规则,覆盖xbrli:context
。
答案 1 :(得分:1)
这个怎么样:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:xbrli="http://xbrli" xmlns:bd-ob-tuple="http://bd-ob-tuple" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
<xsl:if
test="local-name() = 'context' and namespace-uri() = 'http://xbrli'">
<xbrli:unit id="EUR">
<xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
</xsl:if>
</xsl:template>
</xsl:stylesheet>