Я бы хотел сделать
<xsl:variable name="myPattern" select="node1|node2"/>
<xsl:template match="$myPattern">
...
</xsl:template>
<xsl:template match="/">
...
<xsl:for-each select="distinct-values(//$myPattern/name/text()">
...
</xsl:for-each>
</xsl:template>
Я пробовал это с XSLT версии 2.0 и 3.0, но безрезультатно. Какие-нибудь намеки?
Причина: шаблон немного сложнее, и я хотел бы использовать его в нескольких местах, а не только в этом совпадении.
РЕДАКТИРОВАТЬ:
На данный момент я решил свою проблему, приняв тот факт, что переменная содержит не строку / шаблон, а узлы результата. Если я изменю его на
<xsl:variable name="myNodes" select="//(node1|node2)"/>
<xsl:template match="$myNodes">
...
</xsl:template>
<xsl:template match="/">
...
<xsl:for-each select="distinct-values($myNodes/name/text()">
...
</xsl:for-each>
</xsl:template>
работает нормально.
Мне все еще интересно, почему невозможно просто сохранить строку в переменной и использовать ее везде, где разрешены буквальные строки.
match="$xyz"
и объясняет, что $ xyz соответствует любому узлу, который присутствует в значении переменной $ xyz. Таким образом, вам нужно будет показать нам минимальный, но полный образец XML, XSLT, ожидаемых результатов, результатов или ошибок, которые вы получаете, вместе с информацией об используемом процессоре XSLT, чтобы мы могли определить, что не так. Очевидно, я ожидал бы, что ваше объявление переменной будет скорее выглядеть, например,<xsl:variable name="//node1 | //node2"/>
, если только элементы, которые вы ищете, действительно не являются корневыми. - person Martin Honnen   schedule 07.09.2016<xsl:variable name="myNodes" select="//(node1|node2)"/>
. - person mdr   schedule 07.09.2016evaluate()
для преобразования строки в выражение XPath (если вы это имеете в виду). - person michael.hor257k   schedule 07.09.2016