Ваша идея выглядит хорошо, но, возможно, вам не удалось разместить этот код
в нужном месте.
Даже если ваш код был помещен в шаблон, соответствующий целому
документ /
, вывод не будет правильно сформированным XML,
потому что XML-документ должен содержать один узел
на основном (корневом) уровне.
Так, вероятно:
- Скрипт должен содержать соответствующий шаблон
root
(ваш главный узел).
- Теги для основного узла должны быть скопированы (
<xsl:copy>
),
в противном случае на выходе не было бы одного основного узла.
- И, наконец, в пределах этого (между
<xsl:copy>
и
</xsl:copy>
метки) там должны быть размещены ваши <xsl:for-each
цикл.
- Скрипт должен также включать шаблон идентификации .
Примерно так:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="test">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:if test="medium/scribe/node()">
<HasScribe><xsl:value-of select="medium/scribe"/></HasScribe>
</xsl:if>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:transform>
Как видите, я также добавил xsl:apply-templates
для атрибутов,
так что в выводе видно, из какого исходного элемента
был сгенерирован конкретный выходной элемент.
Рабочий пример с незначительным изменением вашего XML см. http://xsltransform.net/ei5Pwjn