XSLT:如何修改内容以替换某些元素的副本?

时间:2011-11-25 15:59:36

标签: xslt

我有一个输入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'包装器'),它是否会保留输出文档中的标签?

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

但是,当然,我需要先将'link'标签重新映射到锚标签....

我甚至没有开始研究如何用链接信息替换变量的内容(当然是在一个新的变量中)....

2 个答案:

答案 0 :(得分:4)

试试这个:

<?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>

答案 1 :(得分:3)

xsl:copy-of没有做你想要的,因为它创建了一个精确的副本。所以不要使用它。

xsl:value-of无法执行您想要的操作,因为它接受字符串值并忽略所有标记。所以不要使用它。

您需要使用“修改后的副本”设计模式,如Vincent的回答所示。这使用两个[或更多,如果需要]模板规则,默认规则适用于要更改的节点,以及应用于需要修改的节点的特定规则。