XSL повторно использовать? ДА! Но: Элемент не должен содержать элемент xsl: import! :-( - PullRequest
0 голосов
/ 24 апреля 2010

Я использую тяжелую таблицу стилей с большим количеством повторяющихся преобразований, поэтому я подумал, что было бы разумно повторно использовать одни и те же куски кода, поэтому мне не нужно вносить одинаковые изменения в кучу разных мест. Итак, я обнаружил, но, увы, это не позволит мне это сделать. При попытке запустить его в Sonic Workbench я получаю следующую ошибку:

Элемент xsl: for-each не должен содержать элемент xsl: import

Это мой код таблицы стилей:

<xsl:template match="/">
  <InboundFargoMessage>
   <EdiSender>
    <xsl:value-of select="TransportInformationMessage/SenderId"/>
   </EdiSender>
   <EdiReceiver>
    <xsl:value-of select="TransportInformationMessage/RecipientId"/>
   </EdiReceiver>
      <EdiSource>PORLOGIS</EdiSource>
      <EdiDestination>FARGO</EdiDestination>
   <Transportations>
    <xsl:for-each select="TransportInformationMessage/TransportUnits/TransportUnit">
     <xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
    </xsl:for-each>
    <xsl:for-each select="TransportInformationMessage/Waybill/TransportUnits/TransportUnit">
     <xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
    </xsl:for-each>
   </Transportations>
  </InboundFargoMessage>
 </xsl:template>
</xsl:stylesheet>

Я пока опущу дочерние xsl-листы, так как проблема, похоже, происходит на базе.

Если я не могу использовать xsl: import, есть ли вариант повторного использования?

Ответы [ 3 ]

3 голосов
/ 24 апреля 2010

Если я не могу использовать xsl: import, есть ли любой вариант повторного использования?

Вы можете использовать <xsl:import>.

Все <xsl:import> элементы должны быть первыми дочерними элементами <xsl:stylesheet>

В качестве альтернативы элемент <xsl:include> должен определяться глобально (дочерний элемент <xsl:stylesheet>), но ему может предшествовать любая другая инструкция xslt, которая может быть размещена глобально.

Вы должны знать и хорошо понимать правила использования этих двух инструкций XSLT. Я бы порекомендовал прочитать хорошую книгу по XSLT.

Основной единицей повторного использования в XSLT является шаблон (<xsl:template>).

Импортируемая таблица стилей может использовать (через <xsl:call-template> или <xsl:apply-templates>) любой шаблон, определенный в любой импортированной таблице стилей.

0 голосов
/ 24 апреля 2010

Спасибо за все предложения, которые были несколько полезны, но позвольте мне сформулировать полный ответ. Как и предполагалось, ответ на вопрос повторного использования лежит в шаблонах xsl:. Шаблоны могут быть определены путем включения их в. Затем, где это необходимо, их можно вызвать, добавив элемент. Кроме того, они могут быть помещены в отдельные листы xsl, если они импортированы вверху родительского листа xsl.

Таким образом, решение моих вопросов выглядит следующим образом:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:far="http://www.itella.com/fargo/fargogate/" xmlns:a="http://tempuri.org/XMLSchema.xsd" xmlns:p="http://tempuri.org/XMLSchema.xsd">
     <xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
     <xsl:template match="/">
        <InboundFargoMessage>
        <EdiSender>
            <xsl:value-of select="TransportInformationMessage/SenderId"/>
        </EdiSender>
        <EdiReceiver>
            <xsl:value-of select="TransportInformationMessage/RecipientId"/>
        </EdiReceiver>
        <EdiSource>PORLOGIS</EdiSource>
        <EdiDestination>FARGO</EdiDestination>
        <Transportations>
            <xsl:for-each select="TransportInformationMessage/TransportUnits/TransportUnit">
                <xsl:call-template name="transport"/>
            </xsl:for-each>
            <xsl:for-each select="TransportInformationMessage/Waybill/TransportUnits/TransportUnit">
                <xsl:call-template name="transport"/>
            </xsl:for-each>
        </Transportations>
    </InboundFargoMessage>
 </xsl:template>

Где файл 'TransportCDMtoFDM_V0.6.xsl' содержит шаблон с именем "transport".

Осталась только одна проблема: при использовании шаблонов используются все узлы, упомянутые в шаблоне, даже если они пусты. Итак, оставшийся вопрос - как оставить пустые узлы?

0 голосов
/ 24 апреля 2010

Каждый из включенных файлов XSL должен содержать шаблон (ы).

Основной файл включает в себя остальные в начале и затем вызывает шаблоны с call-template или apply-templates из разных мест.

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