Могу ли я передать результат шаблона xslt в качестве параметра другому шаблону? - PullRequest
3 голосов
/ 17 июля 2010

Я пытаюсь воссоздать функциональность главной страницы ASP.NET с помощью шаблона XSLT.

У меня есть шаблон "главной страницы", который содержит большую часть HTML-страниц, хранящихся в файле .xslt.,У меня есть другой файл .xslt, специфичный для одной страницы, который принимает xml, представляющий данные страницы.Я хочу вызвать шаблон главной страницы из моего нового шаблона, и у меня все еще есть возможность вставить свой собственный XML, который будет применен.Если бы я мог передать параметр, который позволил бы мне вызывать шаблон с параметром в качестве имени, это бы помогло, но это, по-видимому, недопустимо.

В основном у меня есть это:

<xsl:template name="MainMasterPage">
  <xsl:with-param name="Content1"/>
  <html>
    <!-- bunch of stuff here -->
    <xsl:value-of select="$Content1"/>
  </html>
</xsl:template>

И это:

<xsl:template match="/">
  <xsl:call-template name="MainMasterPage">
    <xsl:with-param name="Content1">
      <h1>Title</h1>
      <p>More Content</p>
      <xsl:call-template name="SomeOtherTemplate"/>
     </xsl:with-param>
   </xsl-call-template>
</xsl:template>

Что происходит, так это то, что вложенный xml в основном удаляется, и все, что вставляется, это "TitleMore Content"

1 Ответ

5 голосов
/ 17 июля 2010

Проблема с предоставленным кодом здесь:

<xsl:value-of select="$Content1"/>

Это выведет либо конкатенацию всех потомков текстовых узлов верхнего узла $Content1 (если он содержит документ), либо строковое значение его первого элемента или дочернего текста (если это фрагмент XML).

Вам нужно использовать

<xsl:copy-of select='$pContent1'>

вместо

<xsl:value-of select='$pContent1'>.

Это правильно копирует все дочерние узлы $pContent1

Ниже приведено исправленное преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <xsl:call-template name="MainMasterPage">
    <xsl:with-param name="pContent1">
      <h1>Title</h1>
      <p>More Content</p>
      <xsl:call-template name="SomeOtherTemplate"/>
     </xsl:with-param>
   </xsl:call-template>
</xsl:template>

<xsl:template name="MainMasterPage">
  <xsl:param name="pContent1"/>
  <html>
    <!-- bunch of stuff here -->
    <xsl:copy-of select="$pContent1"/>
  </html>
</xsl:template>

 <xsl:template name="SomeOtherTemplate">
   <h2>Hello, World!</h2>
 </xsl:template>
</xsl:stylesheet>

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

<html>
   <h1>Title</h1>
   <p>More Content</p>
   <h2>Hello, World!</h2>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...