用xslt添加逗号

时间:2014-07-10 12:26:30

标签: html xml xslt

这是我的XML结构:

<bibliography>
    <element>
        <name>name</name>
        <author><bold>author</bold></author>
        <title>some <italic>title</italic></title>
        <pages>123</pages>
    </element>
    ...
</bibliography>

所以我用这个模板添加逗号:

<xsl:template match="/*/*/*">
  <xsl:if test="position()>2">, </xsl:if>
  <xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:strip-space elements="*" />

这样可行,但这会忽略/*/*/*以下的每个元素。因此,每个<bold><italic>标记都会被忽略。 我该如何解决这个问题?

这是我处理XML的<bold><italic>标记的方式:

<xsl:template match="bold">
    <span style="font-weight:bold;">
        <xsl:apply-templates/>
    </span>
</xsl:template>
<xsl:template match="italic">
    <span style="font-style:italic;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

以下是我的完整XMLXSLT,它们可能有助于找出问题。

2 个答案:

答案 0 :(得分:1)

UPDATE(最后解决了:))


基本上遵循原始xsl:

的变化
<xsl:template match="bibliography/*/*" priority="0">
        <xsl:if test="position()>2">
            <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:apply-templates/>
    </xsl:template>

补充:

<xsl:strip-space elements="*" />

    <xsl:template match="text()">
        <xsl:value-of select='normalize-space()'/>
    </xsl:template>

这是最终代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="bibliography">
        <html>
            <head>
                <title>Bibliographie</title>
                <style type="text/css">
               .entry  {
                   font-family: Georgia;
               }
           </style>
            </head>
            <body>
                <table>
                    <tbody>
                        <xsl:apply-templates/>
                    </tbody>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="bibliography/*">
        <tr>

                <td align="left">[<xsl:number count="*"/>]</td>
                <td align="left">
                    <xsl:apply-templates/>

                </td>

        </tr>
    </xsl:template>

    <xsl:template match="bibliography/*/*" priority="0">
        <xsl:if test="position()>2">
            <xsl:text>, </xsl:text>
        </xsl:if>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="bold">
        <span style="font-weight:bold;">
            <xsl:apply-templates/>
        </span>
    </xsl:template>

    <xsl:template match="italic">
        <span style="font-style:italic;">
            <xsl:apply-templates/>
        </span>
    </xsl:template>

    <xsl:strip-space elements="*" />

    <xsl:template match="text()">
        <xsl:value-of select='normalize-space()'/>
    </xsl:template>

    <xsl:template match="name" priority="1"/>


</xsl:stylesheet>

输出:

Latest Output


以前的建议:

strip-space

使用<xsl:strip-space elements="*" />,它会删除第一个','问题。

对于修剪空间,请参阅:https://stackoverflow.com/a/13974534/3603806

您还可以使用:fn:normalize-space()进行修剪。这是链接:http://www.w3schools.com/Xpath/xpath_functions.asp#string

并解释:

fn:normalize-space(string)

fn:normalize-space()    

从指定的字符串中删除前导和尾随空格,并将所有内部空白序列替换为1并返回结果。如果没有字符串参数,则它在当前节点上执行相同的操作

Example: normalize-space(' The   XML ')

Result: 'The XML'

将您的代码更改为:

 <xsl:template match="/*/*/*">
  <xsl:if test="position()>2">, </xsl:if>
  <xsl:value-of select="normalize-space()"/>
 </xsl:template>

结果如下:

This is the result

答案 1 :(得分:1)

您的基本错误是您使用的是xsl:value-of而不是xsl:apply-templates。我也不清楚你为什么要使用一个笨拙而低效的结构,如:

<xsl:template match="/*/*/*">

而不是使用显式元素名称,例如:

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

然后使用特定模板来处理每个后代节点 - 包括 bolditalic,例如:

<xsl:template match="author">
    <xsl:apply-templates/>
    <xsl:text>, </xsl:text>
</xsl:template>

<xsl:template match="bold">
    <span style="font-weight:bold;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="italic">
    <span style="font-style:italic;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

编辑:

如果您希望为除除作者之外的所有元素子元素都使用通用模板,则可以使用以下内容:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="element/*">
    <xsl:apply-templates/>
    <xsl:text> </xsl:text>
</xsl:template>

<xsl:template match="author" priority="1">
    <xsl:apply-templates/>
    <xsl:text>, </xsl:text>
</xsl:template>

<xsl:template match="bold">
    <span style="font-weight:bold;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="italic">
    <span style="font-style:italic;">
        <xsl:apply-templates/>
    </span>
</xsl:template>

</xsl:stylesheet>