我试图使用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>)
</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;前面在选择中但仍然得到相同的结果。
答案 0 :(得分:0)
请尝试使用此代码:
<xsl:value-of select="*[name()=$xOrY]/C" />
你的concat不起作用,因为concat的结果是字符串x/C
所以谓词(方括号内)的比较是name()='x/C'
,这是假的。