XSLT вставка один раз из пользовательского текста - PullRequest
3 голосов
/ 23 апреля 2010

folloiwng - это уже существующий XML-файл. Мне было интересно, как я могу вставить элемент перед первым элементом, используя xslt?

<XmlFile>
    <!-- insert another <tag> element here -->
    <tag>
        <innerTag>
        </innerTag>
    </tag>
    <tag>
        <innerTag>
        </innerTag>
    </tag>
    <tag>
        <innerTag>
        </innerTag>
    </tag>
</XmlFile>

Я думал об использовании цикла for-each и проверить позицию = 0, но при первом появлении for-each уже слишком поздно. Это единовременный текст, поэтому я не могу объединить его с другими шаблонами xslt, которые уже находятся в файле xsl.

Спасибо.

1 Ответ

3 голосов
/ 23 апреля 2010

Вы должны знать и помнить одну самую важную вещь: правило идентификации .

Вот очень простое и компактное решение, использующее самый фундаментальный шаблон проектирования XSLT: использование и переопределение правила идентификации:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <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="/*/*[1]">
   <someNewElement/>
   <xsl:call-template name="identity"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу, получается требуемый результат :

<XmlFile>
    <!-- insert another <tag> element here -->
    <someNewElement />
<tag>
        <innerTag>
        </innerTag>
    </tag>
    <tag>
        <innerTag>
        </innerTag>
    </tag>
    <tag>
        <innerTag>
        </innerTag>
    </tag>
</XmlFile>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...