Динамическая схема XSL - PullRequest
       11

Динамическая схема XSL

0 голосов
/ 08 октября 2009

Не могу найти причину, по которой не работает следующее.

Если у меня есть документ, который выглядит как

<mydocroot>
<request>
   <key>Ham</key>
</request>
<node>
   <data alias='Ham' id='27'>Some value</data>
   <data alias='Eggs' id='14'>Greenish</data>
   <data alias='Condiment' id='32'>Salt and pepper</data>
   ...
</node>
</mydocroot>

и шаблон xsl, который выглядит как

<xsl:template match="/">
    <xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
</xsl:template>

ничего не печатает.

<xsl:template match="/">
    <xsl:value-of select="/mydocroot/node/data[@alias='Ham']" />
</xsl:template>

печатает «Некоторое значение», как и ожидалось.

Что я делаю не так?

Спасибо!

Edit:

На самом деле я не на 100% уверен, как выглядит базовый документ, с которым я работаю, но я знаю, что если продолжить этот пример,

<xsl:value-of select="/mydocroot/request/key" /> <!-- prints "Ham" -->

работает.

Можно ли сопоставить значение атрибута со значением узла?

Ответы [ 3 ]

0 голосов
/ 08 октября 2009

Итак, я получил следующее для работы, но это кажется хакерским:

<xsl:template match="/">
    <xsl:variable name="aliasval"><xsl:value-of select="string(/mydocroot/request/key)" /></xslvariable>
    <xsl:value-of select="/myrootdoc/node/data[@alias=$aliasval]" />
</xsl:template>

Нужно ли мне создавать переменную только для этого? Я, вероятно, сталкиваюсь здесь со своими знаниями по XSLT.

0 голосов
/ 08 октября 2009

«Должен ли я иметь возможность сопоставить значение атрибута со значением узла?»

Определенно, да. Значением атрибута является строка, и при сравнении со строкой XSLT автоматически приводит другой операнд к строке. Нет необходимости звонить string() явно. Это работает для меня (и должно работать для вас):

<xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key]" />
<!-- prints "Some value" -->

Лучше, потому что более явный (/mydocroot/request/key может выбрать более одного узла!):

<xsl:value-of select="/mydocroot/node/data[@alias = /mydocroot/request/key[1]]" />

В этих ситуациях <xsl:key> также пригодится:

<xsl:key name="kDataByAlias" match="node/data" use="@alias" />

<!-- later... -->

<xsl:value-of select="key('kDataByAlias', /mydocroot/request/key[1])" />
0 голосов
/ 08 октября 2009

Если вы запускаете выражение XPath, используя «/», это означает, что вы начинаете с корневого узла документа, но корневым элементом является «mydocroot», поэтому вам необходимо включить его в свой XPath. *

<xsl:value-of select="/mydocroot/node/data[@alias=string(/mydocroot/request/key)]" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...