我有这个XML代码
<parag>blah blah blah</parag>
<parag>blah blah, refer to <linkCode code1="a" code2="b" code3="c"/> for further details.</parag>
我无法弄清楚如何让链接保持在父文本的中间。以下代码
<xsl:for-each select="parag">
<p><xsl:value-of select="text()"/>
<xsl:for-each select="linkCode">
<a href="file-{@code1}-{@code2}-{@code3}.html">this link</a>
</xsl:for-each>
</p>
</xsl:for-each>
产生
<p>blah blah blah</p>
<p>blah blah, refer to for further details.<a href="file-a-b-c.html">this link</a></p>
我想要的是
<p>blah blah blah</p>
<p>blah blah, refer to <a href="file-a-b-c.html">this link</a> for further details.</p>
有什么想法吗?不,我无法控制XML的内容。
答案 0 :(得分:1)
只使用简单覆盖身份规则:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="linkCode">
<a href="file-{@code1}-{@code2}-{@code3}.html">this link</a>
</xsl:template>
<xsl:template match="parag">
<p><xsl:apply-templates select="node()|@*"/></p>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(将提供的片段包装到单个顶部元素中 - 以获取格式良好的XML文档):
<t>
<parag>blah blah blah</parag>
<parag>blah blah, refer to <linkCode code1="a" code2="b" code3="c"/> for further details.</parag>
</t>
产生了想要的正确结果:
<t>
<p>blah blah blah</p>
<p>blah blah, refer to <a href="file-a-b-c.html">this link</a> for further details.</p>
</t>
如果您想要输出顶部元素:
只需添加此模板:
<xsl:template match="/*"><xsl:apply-templates/></xsl:template>
所以,完整的代码变为:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="linkCode">
<a href="file-{@code1}-{@code2}-{@code3}.html">this link</a>
</xsl:template>
<xsl:template match="parag">
<p><xsl:apply-templates select="node()|@*"/></p>
</xsl:template>
<xsl:template match="/*"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>