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



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

假设我有两个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。

现在我运行:

$ xsltproc z1。xsl x.xml

(ABC)、(DEF)

$ xsltproc z2。xsl y.xml

(某某),(开始)

就是我想要的。到目前为止,一切顺利。

现在我修改xsl文件,我们将其命名为z3。添加参数的XSL我添加

<xsl:param name="xOrY"/>

并修改select lines行:

<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(),并尝试在选择中的"*"前面添加'/',但仍然得到相同的结果。

试着用这个代替:

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

您的concat没有工作,因为concat的结果将是字符串x/C,因此谓词(方括号内)中的比较将是name()='x/C',这是假的。

最新更新