我有一个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命名空间.此时您不再属于该组.
如果你属于"我关心命名空间"组,那么你无论如何都不需要这个建议.;-)