Variables 使用变量作为XPath选择的一部分

Variables 使用变量作为XPath选择的一部分,variables,xslt,xpath,Variables,Xslt,Xpath,我希望使用变量作为XPath表达式的一部分 我的问题可能是msxsl节点集函数。。。不确定。但别让它影响你的判断。。。继续读 我正在使用.NET函数加载内容文件,该文件通过定制的XML内容传入。@file生成一个XML文件 页面上的定制XML如下所示: <control name="import" file="information.xml" node="r:container/r:group[@id='set01']/r:item[1]" /> <xsl:variable

我希望使用变量作为XPath表达式的一部分

我的问题可能是msxsl节点集函数。。。不确定。但别让它影响你的判断。。。继续读

我正在使用.NET函数加载内容文件,该文件通过定制的XML内容传入。@file生成一个XML文件

页面上的定制XML如下所示:

<control name="import" file="information.xml" node="r:container/r:group[@id='set01']/r:item[1]" />
<xsl:variable name="document">
    <xsl:copy-of select="ext:getIncludedContent(@file)" />
</xsl:variable>
XSL看起来像:

<control name="import" file="information.xml" node="r:container/r:group[@id='set01']/r:item[1]" />
<xsl:variable name="document">
    <xsl:copy-of select="ext:getIncludedContent(@file)" />
</xsl:variable>
然后将其转换为节点集,以便查询文档

<xsl:variable name="preset-xml" select="msxsl:node-set($document)" />   
我正在加载的源文件如下所示:

<container>
    <group id="set01">
        <item>value01</item>
        <item>value02</item>
        <item>value03</item>
    </group>
    <group id="set02">
        <item>value04</item>
        <item>value05</item>
    </group>                    
</container>
到目前为止,它一直有效。我可以看到源文件以XML的形式传输和输出

当我试图使用从内容中输入的XPath表达式查询源文件时,我的问题就出现了

我试过:

<xsl:value-of select="$preset-xml/@node" />
<xsl:variable name="node" select="@node" />
<xsl:value-of select="$preset-xml/$node" />
显然,这不起作用,因为它将@node作为XML中加载的节点的直接子节点

我试过:

<xsl:value-of select="$preset-xml/@node" />
<xsl:variable name="node" select="@node" />
<xsl:value-of select="$preset-xml/$node" />
但它不喜欢第二个变量

我尝试了concat$preset xml,“/”,$node,但仍然会在结果中绘制出整个文档

目前,我唯一能使其工作的方法是在模板中写出完整的表达式:

<xsl:value-of select="$preset-xml/r:container/r:group[@id='set01']/r:item[1]" />
它正确地带来了value01

但这是一个硬编码的解决方案。 我想开发一个解决方案,可以从内容中进行操作,以适应任何类型的导入内容,并在内容文件中声明参数


p、 我使用XSLT 1.0是因为技术管理员不会更改Microsoft解析器以支持更高版本的XSL,所以任何解决方案都需要牢记这一点。

XSLT中没有类似于反射的功能。特别是,MS XSLT引擎在加载XSLT时编译XPath查询,而不是在将XSLT应用于XML文档时编译。这是有原因的:它将代码XSLT与数据输入XML分离

你试图通过混淆代码和数据来实现什么;是否确实需要从输入XML执行任意XPath表达式?例如,设想一下,如果用户传入@name等于,例如//*,然后将整个输入XML文档的内容发送到输出,其中可能包含一些敏感数据,该怎么办

如果确实需要执行所描述的操作,可以编写自己的,它将接受文档根和XPath查询,并将后者应用于前者。然后你可以这样称呼它:

<xsl:value-of select="myExtensionNs:apply-xpath($preset-xml, @node)"/>

至于您最初尝试使用concat$preset xml,“/”,$node,concat是字符串连接函数。您向它提供一些参数,它将返回其字符串表示形式的串联。因此,concat$preset xml,“/”,$node将返回$preset xml的字符串值,与/,与$node的字符串值连接。如果您试图编写所需的XPath查询,concat“$preset xml”、“/”、$node似乎更符合逻辑,请注意引号;但是,仍然无法将结果字符串(例如,$preset xml/r:container/r:group[@id='set01']]/r:item[1]计算为对应XPath查询的值);它只能发送到输出。

一个可能的技巧是调用一个参数化xsl:template,它执行关键的选择比较部分,并以字符串形式评估其输出

我在计算任意属性值的所有节点时遇到了一个类似的问题,我通过以下方式解决了这个问题:顺便说一句:$sd='document$filename',因此我加载了一个辅助xml文件内容:

<xsl:template match="/">
  <xsl:variable name="string_cntsuccess">
    <xsl:for-each select="./Testcase">
      <xsl:variable name="tcname" select="@location"/>
      <xsl:for-each select="$sd//TestCase[@state='Passed']">
        <xsl:call-template name="producedots">
          <xsl:with-param name="name" select="$tcname"/>
        </xsl:call-template>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="cntsuccess" select="string-length($string_cntsuccess)"/>
</xsl:template>

<xsl:template name="producedots">
  <xsl:param name="name"/>
  <xsl:variable name="ename" select="@name"/>
  <xsl:if test="$name = $ename">
    <xsl:text>.</xsl:text>
  </xsl:if>
</xsl:template>

$preset xml/@node未查找子节点;它正在寻找一个属性。是的-对不起。轻微的打字错误。它正在查找加载文件的属性。但不管怎样,这种方法仍然行不通。还是有点难堪!如果不希望使用扩展函数,可以将转换分为两个步骤:首先,动态生成一个样式表,基本上将@node atributes中的xpath表达式转换为xsl模板。接下来,将生成的样式表应用于实际内容。当然,我不能说您的环境是否允许这种工作流。当做