2

这似乎是一个非常基本的问题,但最近几天我一直在寻找答案并尝试无济于事。我试图把这个:

<bold> bang </bold> 
<line> I was walking down the street </line> 
<line> when I heard a <bold> bang </bold></line>

进入:

<strong> bang </strong> 
<textline> I was walking down the street </textline> 
<textline> when I heard a <strong> bang </strong></textline>

使用这个:

<xsl:template name="first" match="//line">
    <textline>
        <xsl:value-of select="."/>
    </textline>
</xsl:template>

<xsl:template name="second" match="//bold">
    <strong>
        <xsl:value-of select="."/>
    </strong>
</xsl:template>

<xsl:template match="@*|node()|line|bold">
    <xsl:copy>

        <xsl:apply-templates select="@*|node()|line|bold"
        />
    </xsl:copy>
</xsl:template>

我的问题是它要么命中<bold>OR<line>标签,但不是两者兼而有之。例如:

<strong> bang </strong> 
<textline> I was walking down the street </textline> 
<textline> when I heard a bang </textline>

如果<bold>标签总是在里面<line>,或者从不在里面,那将是直截了当的。

我尝试添加一个我认为会优先考虑的更具体的模板:

<xsl:template name="third" match="//l/bold">
    <strong>
        <xsl:value-of select="."/>
    </strong>
</xsl:template>

但它仍然没有给出预期的结果。我强烈怀疑我的错误是由于对该语言的基本知识有误解,但是四处搜索我找不到任何解决方案任何帮助将不胜感激。

4

2 回答 2

1

这个简短而简单的转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="bold">
     <strong><xsl:apply-templates/></strong>
 </xsl:template>

 <xsl:template match="line">
     <textline><xsl:apply-templates/></textline>
 </xsl:template>
</xsl:stylesheet>

当应用于以下 XML 文档(提供的 XML 片段,包装到单个顶部元素中以成为格式良好的 XML 文档)时:

<t>
    <bold> bang </bold>
    <line> I was walking down the street </line>
    <line> when I heard a <bold> bang </bold></line>
</t>

产生想要的正确结果

<strong> bang </strong>
<textline> I was walking down the street </textline>
<textline> when I heard a <strong> bang </strong></textline>
于 2012-09-21T03:55:46.493 回答
0

而不是value-of在特定模板中,使用apply-templates. 您希望在匹配一组后继续对标签进行递归处理。

于 2012-09-20T21:45:11.503 回答