XSLT копия с изменениями - PullRequest
       12

XSLT копия с изменениями

2 голосов
/ 09 августа 2010

Я застрял, пытаясь работать в рамках этих ограничений, я использую XSLT 1.0 {под .net}. Я хотел бы иметь возможность сделать следующее: Я xsl: для каждого через набор узлов типа

   <node>
     <data> unknown unstructured xml </data>
     <owner></owner>
   </node>

я бы хотел иметь возможность вывести

   <node>
     <data> unknown unstructured xml </data>
     <!--RESULT of calling an XSL template with certain parameters -->
   </node>

из моих поисков я думал, что смогу сделать что-то вроде здесь :

    <xsl:copy> 
        <xsl:apply-template name="findownerdetails">
           <xsl:with-param name="data" select="something" />
        </xsl:apply-template> 
    </xsl:copy> 

но это, по-видимому, неверно. какие-нибудь предложения, как заставить это работать или достигнуть чего-то подобного? Боюсь, я не могу просто вызвать apply-templates, так как шаблон, который я хочу, будет зависеть от некоторых данных, которые я собираю для каждого элемента списка элементов узла.

Любой совет приветствуется

Ответы [ 2 ]

5 голосов
/ 09 августа 2010

Это классический пример проблемы, которую лучше всего решить, используя и переопределяя правило идентификации :

<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:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="owner">
    <owner-details>
      <xsl:value-of select="."/>
    </owner-details>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразованиеприменяется к этому XML-документу (на основе предоставленного XML-документа с добавленными атрибутами и сведениями о владельце):

<node attr1="x" attr2="y">
    <data> unknown unstructured xml </data>
    <owner>
        <details>
            <name>John Smith </name>
            <profession>XSLT programmer</profession>
        </details>
    </owner>
</node>

Получен требуемый результат :

<node attr1="x" attr2="y">
   <data> unknown unstructured xml </data>
   <owner-details>John Smith XSLT programmer</owner-details>
</node>

Запишите :

  1. Шаблон идентификации копирует каждый узел в документе "как есть" рекурсивным способом.

  2. Мы переопределяем шаблон идентификации только для элементов, которые мы хотим обработать другим способом .Любой шаблон, шаблон сопоставления которого более специфичен, чем шаблон идентификации, переопределяет его - процессор XSLT всегда выбирает наиболее конкретный шаблон сопоставления для узла.а переопределение правила идентификации - самый фундаментальный , самый мощный, самый общий и самый элегантный шаблон проектирования XSLT .Он используется исключительно почти во всех преобразованиях XSLT: для удаления / переименования / изменения / добавления определенных узлов и сохранения всех остальных узлов в целости.

  3. ФП предложил в комментарии, чтоэто решение не позволяет передавать параметры.Это не правда .Любой шаблон (включая правило идентификации) может быть написан так, чтобы иметь параметры - когда это необходимо.В данном конкретном случае не необходимо для передачи параметров через шаблоны.

  4. Соответствующий шаблон owner не нуждается для вызова другого шаблона - вся обработка, относящаяся к владельцу, может быть выполнена здесь.

1 голос
/ 09 августа 2010
<xsl:template match="node">
  <node>
    <xsl:copy-of select="data"/>
    <!-- assuming this next bit in your question example
    is something you are happy with -->
    <xsl:call-template name="findownerdetails">
      <xsl:with-param name="data" select="something" />
    </xsl:call-template> 
  </node>
</xsl:template>
...