Xml 使用参数时,select的xsl值返回空

Xml 使用参数时,select的xsl值返回空,xml,xslt,Xml,Xslt,我试图使用xsltproc和stringparam从一些xml文件中获取数据,但无法使其正常工作。这有点冗长,但我已经给出了一些我尝试过的例子 假设我有两个XML文件x.XML和y.XML,它们之间唯一的模式差异是根标记。 像这样: <?xml version="1.0" ?> <x> <C>ABC</C> <D>DEF</D> </x> <?xml version="1.0"?> <

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

假设我有两个XML文件x.XML和y.XML,它们之间唯一的模式差异是根标记。 像这样:

<?xml version="1.0" ?>
<x>
  <C>ABC</C>
  <D>DEF</D>
</x>
<?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>

基础知识
DEF


XYZ
紫外线
现在我编写了两个xsl文件z1.xsl和z2.xsl来处理XML 像这样:

<?xml version="1.0" ?>
<x>
  <C>ABC</C>
  <D>DEF</D>
</x>
<?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之间的唯一区别是,在select中,“x/C”替换为“y/C”,而“x/D”替换为“y/D”

现在我运行:

$xsltproc z1.xsl x.xml

(ABC),(DEF)

$xsltproc z2.xsl y.xml

(XYZ),(UVW)

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

现在我修改了xsl文件,让我们将其命名为z3.xsl以添加一个参数 我补充说


并将“选择行”修改为:

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

尝试使用此选项:

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


您的concat不起作用,因为concat的结果将是字符串
x/C
,因此谓词中的比较(在方括号内)将是
name()='x/C'
,这是false。

请尝试使用此选项:

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


您的concat不起作用,因为concat的结果将是字符串
x/C
,因此谓词中的比较(在方括号内)将是
name()='x/C'
,这是错误的。

可能尝试
好吧。就这么简单。谢谢你,丹尼尔。知道concat为什么不起作用吗?concat的结果是字符串
x/C
,因此谓词中的比较(在方括号内)是
name()='x/C'
,这是false。我会加上它作为答案。也许试试
好吧,呜咽。就这么简单。谢谢你,丹尼尔。知道concat为什么不起作用吗?concat的结果是字符串
x/C
,因此谓词中的比较(在方括号内)是
name()='x/C'
,这是false。我会加上它作为答案。