2

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

4

1 回答 1

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>
于 2012-12-07T14:20:32.923 回答