在XSL中定义和使用变量

时间:2014-02-20 09:59:54

标签: xml variables xslt xsl-fo

我有一个带变量和参数的xsl文件。参数在另一个xml文件中定义:

<fo:block><xsl:value-of select="root/period"/></fo:block>

并且参数的值为:

<root>
  <period>1-5</period>
</root>

现在,有时我想要显示包含句号的块,有时我不想。我怎样才能做到这一点?这是我尝试的方式:

<xsl:variable name="cond" select="root/cond"/>
<xsl:if test="$cond='1'">
  <fo:block><xsl:value-of select="root/period"/></fo:block>
</xsl:if>

参数:

<root>
  <cond>1</cond>
  <period>1-5</period>
</root>

这不起作用! 我使用<xsl:copy-of select="$cond" />显示了变量的值,它是空的。

更新

我现在知道问题是什么:

XSL-FO:

<fo:flow flow-name="xsl-region-body">
  <fo:block>
    test
  </fo:block>
  <fo:block>
    <xsl:variable name="cond" select=root/cond/>
    <xsl:copy-of select="$cond" />
  </fo:block>
  <fo:block>
    <xsl:value-of select="root/period"/>
  </fo:block>
</fo:flow>

参数:

<root>
  <cond>haha</cond>
  <period>01.01.2013 – 31.12.2013</period>
</root>

输出:

测试 01.01.2013 - 2013年12月31日

所以问题是:如何从xml参数中选择一个值并将值赋给xsl变量?

2 个答案:

答案 0 :(得分:1)

有几件事。

首先,您展示的更新的XSL-FO格式不正确:

<xsl:variable name="cond" select=root/cond/>

select属性值需要它周围的引号:

<xsl:variable name="cond" select="root/cond" />

我认为这不是真正的问题,因为如果是这样的话,你根本就没有输出,只是一个错误。

但我认为你真正的问题在于你说的话

<xsl:copy-of select="$cond" />

由于您使用的是copy-of而不是value-of,因此会将$ cond变量中的节点复制到输出中。因此,您的输出FO将包含元素<cond>haha</cond>。 我不知道FO处理器应该用这样的元素做什么,这些元素没有命名空间。显然,输出文本内容并不是它的作用;它可能会忽略它们。

尝试将该副本更改为value-of:

<xsl:value-of select="$cond" />

这会将haha放入输出中,而不会有<cond>元素。 试试这个,如果它没有达到您的预期,请告诉我们

  1. 你得到的FO输出(FO处理器运行前样式表的输出)
  2. 你得到的最终输出(FO处理器的输出)
  3. 以及它们与您的预期有何不同。

答案 1 :(得分:-2)

这是解决方案:

<xsl:variable name="firstLine">
  <xsl:value-of select="root/firstLine"/>
</xsl:variable>

你是如何从参数(xml)获得值的。