包含子内容的父文本

时间:2012-12-07 13:56:15

标签: xslt-2.0

我有这个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的内容。

1 个答案:

答案 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>