我试图使用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>)
</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'
,这是假的。