这是我的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>
答案 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>
输出:
以前的建议:
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>
结果如下:
答案 1 :(得分:1)
您的基本错误是您使用的是xsl:value-of
而不是xsl:apply-templates
。我也不清楚你为什么要使用一个笨拙而低效的结构,如:
<xsl:template match="/*/*/*">
而不是使用显式元素名称,例如:
<xsl:template match="element">
<xsl:apply-templates/>
</xsl:template>
然后使用特定模板来处理每个后代节点 - 包括 bold
和italic
,例如:
<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>