使用参数时,xsl value-of select返回空

时间:2016-11-16 17:16:42

标签: xml xslt

我试图使用xsltproc和stringparam从某些xml文件中获取数据,但我无法使其工作。这有点冗长,但我已经举出了一些我尝试过的例子。

假设我有2个XML文件x.xml和y.xml,其中唯一的架构差异是根标记。 像这样:

<?xml version="1.0" ?>
<x>
  <C>ABC</C>
  <D>DEF</D>
</x>

<?xml version="1.0" ?>
<y>
  <C>XYZ</C>
  <D>UVW</D>
</y>

现在我编写2个xsl文件z1.xsl和z2.xsl来处理XML 像这样:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:output method="text" />

    <xsl:text>(</xsl:text>
    <xsl:value-of select="x/C" />
    <xsl:text>),(</xsl:text>
    <xsl:value-of select="x/D"/>
    <xsl:text>)&#x0a;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

z1.xsl和z2.xsl之间的唯一区别是&#34; x / C&#34;被替换为&#34; y / C&#34;和&#34; x / D&#34;替换为&#34; y / D&#34;在选择中。

现在我跑:

$ xsltproc z1.xsl x.xml

(ABC),(DEF)

$ xsltproc z2.xsl y.xml

(XYZ),(UVW)

这就是我想要的。到目前为止,非常好。

现在我修改xsl文件,让我们称之为z3.xsl来添加参数 我添加

<xsl:param name="xOrY"/>

并修改选择行这一行:

<xsl:value-of select="concat($xOrY,'/C')"/>
<xsl:value-of select="concat($xOrY,'/D')"/>

现在我跑

$ xsltproc --stringparam xOrY x z3.xsl x.xml

(X / C),(X / d)

这当然不是我想要的。我做了一些搜索,发现我的选择应该是这样的:

<xsl:value-of select="*[name()=concat($xOrY,'/C')]" />
<xsl:value-of select="*[name()=concat($xOrY,'/D')]" />

但是产生了这个输出

(),()

我也尝试过使用local-name()而不是name(),并尝试添加&#39; /&#39;在&#39; *&#39;前面在选择中但仍然得到相同的结果。

1 个答案:

答案 0 :(得分:0)

请尝试使用此代码:

<xsl:value-of select="*[name()=$xOrY]/C" />

你的concat不起作用,因为concat的结果是字符串x/C所以谓词(方括号内)的比较是name()='x/C',这是假的。