Обработка только выбранных узлов - PullRequest
2 голосов
/ 05 ноября 2008

Проблема новичка в XSLT: мне нужно подставить текстовое значение в XML-файл. Все остальные узлы должны быть оставлены без изменений. Вот мой входной файл (in.xml):

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <level1 attr1="val1">
        <level2>in</level2>
    </level1>
</root>

Вот мое XSLT-преобразование (subst.xsl):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="//node()">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/root/level1/level2/text()">out</xsl:template>
</xsl:stylesheet>

Я запускаю его с помощью следующего Ant-скрипта (build.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="test" basedir=".">
    <target name="test">
        <xslt style="subst.xsl" in="in.xml" out="out.xml" />
    </target>
</project>

И вот что я получаю (out.xml):

<?xml version="1.0" encoding="UTF-8"?><root>
    <level1>
        <level2>out</level2>
    </level1>
</root>

Атрибут "attr1" для "level1" отсутствует.

Буду очень признателен, если кто-нибудь

  • подскажите что не так с subst.xsl

OR

  • подскажите, как заставить xslt-процессор просто скопировать несопоставленные узлы в выходной файл и сделать это вручную (что в моем случае подвержено ошибкам).

1 Ответ

11 голосов
/ 05 ноября 2008

В вашем преобразовании идентичности отсутствуют атрибуты (очевидно). Используйте это вместо:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Затем просто добавьте свой последний шаблон.

...