XSLT выбрать шаблон - PullRequest
       3

XSLT выбрать шаблон

2 голосов
/ 18 декабря 2011

У меня есть приложение, написанное на C #, которое должно применить имя шаблона к XML-файлу, определенному в XSLT.

Пример XML:

<Data>
    <Person>
        <Name>bob</Name>
        <Age>43</Age>
    </Person>
    <Thing>
       <Color>Red</Color>
    </Thing>
</Data>

Пример XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:param name="TargetName" />
    <xsl:param name="RootPath" />

    <xsl:Template Name="AgeGrabber">
        <xsl:value-of select="/Person/Age" />
    </xsl:Template>

    <xsl:Template Name="ColorGrabber">
        <xsl:value-of select="/Color" />
    </xsl:Template>

</xsl:stylesheet>

Скажем, я хотел запустить шаблон "ColorGrabber" с путем "/ Data / Thing", а затем запустить другое преобразование с шаблоном "AgeGrabber" с путем "/ Data". Это возможно? Я думал, что смогу передать путь и имя шаблона (тогда 2 параметра сверху), а затем выполнить какой-то тип переключения, но похоже, что xsl: call-template не может принимать параметр в качестве атрибута имени.

Как мне добиться этого поведения?

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

У этого вопроса есть ряд вопросов :

  1. <xsl:stylesheet version="2.0" ... указано, однако в настоящее время> NET изначально не поддерживает XSLT 2.0.

  2. Пример кода не имеет особого смысла, поскольку один 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 .

0 голосов
/ 18 декабря 2011

Ты получил это задом наперед.Вы должны создать шаблоны, соответствующие узлам, которые вы хотите использовать.

<xsl:stylesheet>
    <xsl:template match="Person|Thing">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="Person">
        <xsl:value-of select="Age" />
    </xsl:template>

    <xsl:template match="Thing">
        <xsl:value-of select="Color" />
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 18 декабря 2011

Гораздо проще: подготовить два правила применения шаблонов (для элементов Age и Color) и условно отправить соответствующий узел для преобразования - / / Person / Age или / / Thing / Color

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...