我有一个XML数据文件,其中包含一串任意多个逗号分隔的值。我希望这些值在网络浏览器中显示为每行一个值的列表。因此,我编写了一个XSLT模板,该模板使用此字符串,显示第一个值,后跟一个换行符(<br/>
),并用正确的名称隔开,其余部分则包含资源。实际上,逗号已被HTML <br/>
标记代替。
现在,当我将调用模板的结果存储在xsl:variable
中并通过xsl:value-of
显示出来时,HTML标记消失了:显示的是字符串减去逗号。>
当我用xsl:call-template
代替xsl:value-of
来直接显示结果时,一切都很好,并且值显示在列表中。
那是怎么回事?
此行为是实现工件还是标准XSLT?
答案 0 :(得分:1)
如果要输出节点(例如br
元素),请使用xsl:copy-of
而不是xsl:value-of
,xsl:value-of
创建一个具有字符串值的简单文本节点选择。
下面是显示xsl:value-of
和xsl:copy-of
之间的区别的示例,您会注意到,并不是新创建的br
元素使用变量才有区别,只需使用xsl:value-of
就能创建一个text()
节点,并将选择的字符串转换为
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes" version="5" doctype-system="about:legacy-doctype"/>
<xsl:variable name="var">Phrase 1.<br/>Phrase 2.<br/>Phrase 3.</xsl:variable>
<xsl:template match="/">
<html>
<head>
<title>.NET XSLT Fiddle Example</title>
</head>
<body>
<section>
<h1>Example 1: value-of</h1>
<xsl:value-of select="$var"/>
</section>
<section>
<h1>Example 2: copy-of</h1>
<xsl:copy-of select="$var"/>
</section>
<xsl:apply-templates select="//p"/>
<xsl:apply-templates select="//p" mode="copy-of"/>
</body>
</html>
</xsl:template>
<xsl:template match="p">
<section>
<h1>Example 1: value-of</h1>
<xsl:value-of select="."/>
</section>
</xsl:template>
<xsl:template match="p" mode="copy-of">
<section>
<h1>Example 1: copy-of</h1>
<xsl:copy-of select="."/>
</section>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gWmuiJy/1
输出为
Example 1: value-of
Phrase 1.Phrase 2.Phrase 3.
Example 2: copy-of
Phrase 1.
Phrase 2.
Phrase 3.
Example 1: value-of
Line 1.Line 2.Line 3.
Example 1: copy-of
Line 1.
Line 2.
Line 3.
答案 1 :(得分:0)
似乎您达到了RTF ("Result tree fragment")的界限:
当您使用XML片段初始化变量或参数时,则该变量或参数属于 “结果树片段”数据类型。这是特定于XSLT 1.0的数据类型[就像节点集一样,但略有不同]。 结果树片段等效于仅包含根节点的节点集。
您不能在结果树片段上应用“ /”,“ //”之类的运算符或谓词。它们仅适用于节点集数据类型。
[...]
a)在XSLT 1.0中
解决方法是将结果树片段转换为节点集。我不知道任何特定于Oracle的xpath扩展功能可以为您完成此操作。
您可以使用EXSLT来实现。
b)使用XSLT 2.0
您可以在XSLT 2.0中编码您的转换。 XSLT 2.0将弃用ResultTreeFragments,即,如果您正在对XSLT 2.0转换建模,并且创建了一个包含树片段的变量或参数,则它隐含地是一个节点序列。
因此,如果不使用大于1的XSLT版本,您将很不走运。因此,最好使用XSLT-2.0或3.0解决此问题。
此行为是实现工件还是标准XSLT?
这是XSLT-1.0的标准配置,但不是XSLT-2.0 +的标准。