match="$variable"
- это новый синтаксис в XSLT 3.0, который соответствует узлам в наборе узлов, содержащемся в глобальной переменной. Переменная содержит совпадающие узлы, а не их имена.
Кроме того, select = "p | a" выбирает узлы в контексте документа, а это не то, что вам нужно. Используйте select="'p|a'"
, чтобы установить переменную в строку. Это помогает использовать атрибут as
, например. as="node()*"
или as="xs:string"
, чтобы избежать путаницы относительно того, что переменная на самом деле должна содержать.
Чтобы сопоставить имена, используйте match="*[local-name()=tokenize($container, '\|')]"
В качестве альтернативы вы можете определить состояние c параметр и теневой атрибут:
<xsl:param name="container" select="'p|a'" static="yes"/>
<xsl:template _match="{$container}">...</xsl:template>
Или, если вы предпочитаете, вы можете инициализировать переменную для набора совпадающих узлов, например:
<xsl:param name="matching-nodes" select="//p | //a"/>
, а затем сопоставить, используя
<xsl:template match="$matching-nodes"/>
Но учтите, что это работает, только если вы сопоставляете узлы в первичном исходном документе.