XSLT:变量和“空”标签

时间:2018-08-08 21:34:23

标签: variables xslt

我有一个XML数据文件,其中包含一串任意多个逗号分隔的值。我希望这些值在网络浏览器中显示为每行一个值的列表。因此,我编写了一个XSLT模板,该模板使用此字符串,显示第一个值,后跟一个换行符(<br/>),并用正确的名称隔开,其余部分则包含资源。实际上,逗号已被HTML <br/>标记代替。

现在,当我将调用模板的结果存储在xsl:variable中并通过xsl:value-of显示出来时,HTML标记消失了:显示的是字符串减去逗号。

当我用xsl:call-template代替xsl:value-of来直接显示结果时,一切都很好,并且值显示在列表中。

那是怎么回事?
此行为是实现工件还是标准XSLT?

2 个答案:

答案 0 :(得分:1)

如果要输出节点(例如br元素),请使用xsl:copy-of而不是xsl:value-ofxsl:value-of创建一个具有字符串值的简单文本节点选择。

下面是显示xsl:value-ofxsl: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 +的标准。