如何在XSLT中动态选择节点

pan*_*kaj 1 xslt

我有一个XML文件:

<?xml version="1.0" standalone="yes"?>
<Questionnaire>
  <Temp_GridTypeTable_6>
    <Column2>Select Yes/No</Column2>
  </Temp_GridTypeTable_6>
  <Temp_GridTypeTable_1>
    <Column2>Rank 1,2,3</Column2>
  </Temp_GridTypeTable_1>
  <Temp_GridTypeTable_1>
    <Column1>I needed the income</Column1>
    <Column2>Why did you take a job on this project?</Column2>
  </Temp_GridTypeTable_1>
  <Temp_GridTypeTable_1>
    <Column1>Other</Column1>
    <Column2></Column2>
  </Temp_GridTypeTable_1>
  <Temp_GridTypeTable_2>
    <Column2>Select "Yes/No"</Column2>
  </Temp_GridTypeTable_2>
  <Temp_GridTypeTable_2>
    <Column1>No jobs</Column1>
    <Column2>344</Column2>
  </Temp_GridTypeTable_2>
  <Temp_GridTypeTable_3>
    <Column2>Input</Column2>
  </Temp_GridTypeTable_3>
  <Temp_GridTypeTable_3>
    <Column1>Unit</Column1>
    <Column2>123</Column2>
  </Temp_GridTypeTable_3>
</Questionnaire> 
Run Code Online (Sandbox Code Playgroud)

我想访问

<xsl:for-each select="Questionnaire/concat('Temp_GridTypeTablenode_',"1"))>
Run Code Online (Sandbox Code Playgroud)

但是这个说法不起作用.

Tom*_*lak 11

这是如何不使用XML的一个例子."Temp_GridTypeTable"和"Column"数字是数据,而不是结构,它们不应包含在元素名称中.那你为什么不用一些不那么痛苦的东西说:

<Questionnaire>
  <Temp_GridTypeTable type="6">
    <Column num="2">Select Yes/No</Column>
  </Temp_GridTypeTable>
  <Temp_GridTypeTable type="1">
    <!-- ... -->
  <Temp_GridTypeTable>
  <!-- ... -->
</Questionnaire>
Run Code Online (Sandbox Code Playgroud)

话虽如此,对于您目前的情况,这是必要的:

<xsl:for-each select="Questionnaire/*[
  local-name()
  =
  concat('Temp_GridTypeTable_', '1')
]">
Run Code Online (Sandbox Code Playgroud)

对于输入的"不太痛苦"版本,这是必需的:

<xsl:for-each select="Questionnaire/Temp_GridTypeTable[@type = 1]">
Run Code Online (Sandbox Code Playgroud)

尽管第二个表达式更简单,更直接,但它的表现也会更好.如果您可以提供帮助,我建议您更改输入XML.


编辑:继续在评论中展开自己的论点,我试着强调local-name()name()XPath函数之间的区别,以及差异的重要性:

                            | XML has namespaces  |  XML has no namespaces
----------------------------+---------------------+-----------------------
I care about namespaces     | use `name()`        |  use either function
                            |                     |
don't care about namespaces | use `local-name()`  |  use either function

通常:如果你属于"不关心命名空间"组(大多数XML新手或临时XML用户都这样做),那么总是使用它是可以的(有时甚至是有益的)local-name().但是,当您获得的结果和您期望的结果开始分歧时,请准备好了解XML命名空间.此时您不再属于该组.

如果你属于"我关心命名空间"组,那么你无论如何都不需要这个建议.;-)