Проблема с тем, что у вас есть:
<xsl:variable name="elementName" select="@nodeName" />
...
<xsl:value-of select="/ROOT/DATASET/DATA[$pos]/*[name() = $elementName]" />
состоит в том, что предполагается, что elementName
- это имя только одного элемента.Если это произвольное выражение XPath, тест не пройден.
Вторая проблема, с которой вы столкнетесь (или, вероятно, уже столкнулись), заключается в том, что шаблоны значений атрибутов недопустимы в предложениях select, поэтому вы не можете сделать это.что-то простое, как это:
<xsl:value-of select="/ROOT/DATASET/DATA[$pos]/{$elementName}" />
Вам нужно что-то, что будет динамически создавать выражение XPath для элемента, который вы ищете, а затем динамически оценивать это выражение.
Для решения я обратился к функции evaluate()
EXSLT в библиотеке dynamic
.Мне пришлось использовать его дважды: один раз для построения полного выражения XPath, представляющего запрос, и один раз для оценки этого запроса.Преимущество этого подхода заключается в том, что вы получаете доступ к полным возможностям синтаксического анализа и выполнения XPath evaluate
.
<xsl:variable name="elementLocation" select="@nodeName" />
<xsl:variable name="query" select="concat('/ROOT/DATASET/DATA[$pos]/',
dyn:evaluate('$elementLocation'))"/>
...
<xsl:value-of select="dyn:evaluate($query)"/>
, где пространство имен dyn
вверху объявлено как <a href="http://exslt.org/dynamic" rel="nofollow noreferrer">http://exslt.org/dynamic</a>
.Выяснить, где цитировать здесь сложно, и мне потребовалось несколько попыток, чтобы получить правильные значения.
Используя их вместо ваших elementName и выражений value-value, я получаю:
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:dyn="http://exslt.org/dynamic">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
</head>
<body><table border="1">
<tr>
<td>Foo Bar</td>
<td>Fizz</td>
</tr>
<tr>
<td>testBar</td>
<td>testFizz</td>
</tr>
<tr>
<td>testBar2</td>
<td>testFizz2</td>
</tr>
</table></body>
</html>
, вот чтоЯ думаю, что вы ищете.
К сожалению, я не разбираюсь в MSXML, поэтому не могу сказать вам, поддерживает ли ваш конкретный процессор XSLT это расширение или что-то подобное.