Преобразование XML с помощью xslt в CSV-файл - PullRequest
0 голосов
/ 10 ноября 2011

У меня проблема с тегами xsl: templates и xsl: call-template.Возможно, это нехватка понимания, но вот что я пытаюсь сделать ...

Если у меня есть шаблон, который совпадает с "/ *", и мне нужно вызвать другие шаблоны из прилагаемого шаблонакоторые требуют других контекстов документа, каков наиболее эффективный способ сделать это?

<xsl:template match="/*">

<xsl:call-template name="header">
  <xsl:with-param name="headerContext" select="./[1]"/>
</xsl:call-template>

<xsl:call-template name="body">
  <xsl:with-param name="bodyContext" select="*/*/[1]"/>
</xsl:call-template>

<xsl:template>

Я использую xsl: with-param при вызове шаблонов заголовка и тела, чтобы я мог переопределить match = "/ * "из вмещающего шаблона, но когда я делаю это, вывод получается испорченным.Если я закомментирую вызов шаблона «заголовка», шаблон тела будет работать правильно, и наоборот, но вызов обоих из основного шаблона, как вы видите в приведенном выше примере, заставляет их вести себя странно.Шаблоны заголовка и тела требуют выделения для различных частей документа, поэтому я решил использовать w0th-param, но я не думаю, что он даже работает.

Должен ли я вместо этого использовать apply-templates?

1 Ответ

0 голосов
/ 10 ноября 2011

XSL был разработан для событий. Поэтому, как правило, вам нужно использовать сопоставление с шаблоном, а не явно указывать, какие потомки следует обрабатывать.

<!-- Identity Template will copy every node to the output. -->
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<!-- You listed ./[1] as your xpath, but you might want to add more information 
   to make it more specific.  i.e. element names, not just * and position. -->
<xsl:template match="/*/header">
   <someOutputHeader><xsl:apply-templates /></someOutputHeader>
</xsl:template>

<xsl:template match="/something/*/body">
   <newBody><xsl:apply-templates /></newBody>
</xsl:template>

Также рекомендуется указывать nodeTest перед предикатом. Так, например, вместо записи «./[1]» вы можете указать * после косой черты. "./*[1]" Вам также не нужно использовать "./". Это подразумевается xpath. Так что на самом деле, это "* [1]"

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