XSLT - Добавить новый элемент в определенном месте - PullRequest
3 голосов
/ 03 февраля 2011

Я новичок в 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?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Это преобразование :

<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 голос
/ 03 февраля 2011

Как насчет этого:

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...