Это пример того, как не использовать 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>
Как говорится, для вашей текущей ситуации это необходимо:
<xsl:for-each select="Questionnaire/*[
local-name()
=
concat('Temp_GridTypeTable_', '1')
]">
Для "менее болезненной" версии ввода это потребовалось бы:
<xsl:for-each select="Questionnaire/Temp_GridTypeTable[@type = 1]">
Несмотря на то, что второе выражение намного проще и понятнее, оно также будет работать намного лучше. Если вы можете помочь, я рекомендую изменить входной 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, когда полученные результаты и ожидаемые результаты начинают расходиться. На данный момент вы больше не принадлежите к указанной группе.
Если вы попадаете в группу «Я забочусь о пространствах имен», вам все равно не нужен этот совет. ; -)