У этого вопроса есть ряд вопросов :
<xsl:stylesheet version="2.0" ...
указано, однако в настоящее время> NET изначально не поддерживает XSLT 2.0.
Пример кода не имеет особого смысла, поскольку один XML-документ не может содержать элементы /Person/Age
и /Color
- у правильно сформированного XML-документа есть только один верхний элемент, и он может быть либо Person
, либо Color
, но не оба.
В случае, если был более значимый пример :
<Person>
<Age>27</Age>
<HairColor>blond</HairColor>
</Person>
одним простым решением является :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pProperty" select="'Age'"/>
<xsl:template match="/">
<xsl:value-of select="/*/*[name()=$pProperty]"/>
</xsl:template>
</xsl:stylesheet>
и когда это преобразование применяется к вышеуказанному XML-документу, оно дает желаемый результат:
27
Если вложенность элементов, представляющих интерес, может быть произвольной и / или нам нужно выполнить различную обработку для различных элементов , тогда подходящим решением будет использование соответствующих шаблонов (не названные):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pProperty" select="'HairColor'"/>
<xsl:template match="Age">
<xsl:if test="$pProperty = 'Age'">
This person is <xsl:value-of select="."/> old.
</xsl:if>
</xsl:template>
<xsl:template match="HairColor">
<xsl:if test="$pProperty = 'HairColor'">
This person has <xsl:value-of select="."/> hair.
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к тому же XML-документу (см. Выше), снова получается правильный результат :
This person has blond hair.
Наконец , если вы действительно хотите смоделировать функции высшего порядка (HOF) в XSLT 1.0 или XSLT 2.0, посмотрите этот ответ: https://stackoverflow.com/a/8363249/36305 или узнайте о FXSL .