我有一个输入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'标签重新映射到锚标签....
我甚至没有开始研究如何用链接信息替换变量的内容(当然是在一个新的变量中)....
答案 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的回答所示。这使用两个[或更多,如果需要]模板规则,默认规则适用于要更改的节点,以及应用于需要修改的节点的特定规则。