XSLT: копия, как изменить содержимое, чтобы заменить определенные элементы? - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть входной XML-документ примерно такой:

<text>
    <p>
    Download the software from <link id="blah">
    </p>
</text>
    <links>
    <link id="blah">
    <url>http://blah</url>
    </link>
    </links>

И я хотел бы, чтобы мой выходной документ был:

<text>
    <p>
    Download the software from <a href="http://blah"> http://blah </a>
    </p>
</text>

То есть: я хочу скопировать существующие узлы входного документа как есть, но также заменить некоторые узлы (например) расширенной версией: на основе другой информации, содержащейся во входном документе.

Я пытался использовать xsl: copy для первой копии во фрагменте следующим образом:

<xsl:variable name="frag">
<xsl:copy-of select="text"/>
</xsl:variable>

Но когда я вывожу переменную следующим образом:

<xsl:value-of select="$frag">

Вывод не отображает теги абзаца? Так что я не уверен, что xsl-copy скопировала узлы или просто текст как-то?

Если я добавлю только следующее (удалите xsl: variable 'wrapper'), он сохранит теги в выходном документе?

<xsl:copy-of select="text"/>

Но, конечно, мне нужно сначала переназначить этот тег 'link' на тег привязки ....

Я даже не начал выяснять, как заменить содержимое переменной (в новой переменной, разумеется) информацией о ссылке ...

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Попробуйте это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output indent="yes"/>
    <xsl:template match="links"/>
    <xsl:template match="*|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="link">
        <xsl:variable name="link" select="normalize-space(//links/link[@id = current()/@id]/url)"/>
        <a href="{$link}">
            <xsl:value-of select="$link"/>
        </a>
    </xsl:template>
</xsl:stylesheet>

Со следующим вводом:

<?xml version="1.0" encoding="UTF-8"?>
    <texts>
        <text>
            <p>
                Download the software from <link id="blah"/>
            </p>
        </text>
        <links>
            <link id="blah">
                <url>http://blah</url>
            </link>
        </links>
    </texts>

Вы получаете:

<?xml version="1.0" encoding="UTF-8"?>
<texts>
    <text>
        <p>
            Download the software from <a href="http://blah">http://blah</a>
        </p>
    </text>
</texts>
3 голосов
/ 25 ноября 2011

xsl:copy-of не делает то, что вы хотите, потому что он создает точную копию.Так что не используйте его.

xsl:value-of не делает то, что вы хотите, потому что он принимает строковое значение и игнорирует всю разметку.Так что не используйте его.

Вам необходимо использовать шаблон проектирования «модифицированная копия», как показано в ответе Винсента.При этом используются два [или более при необходимости] шаблонных правила, правило по умолчанию, которое применяется к узлам, которые должны быть скопированы без изменений, и специальное правило, которое применяется к узлам, которые необходимо изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...