Мне нужна таблица стилей XSL, которая позволяет мне перемещать элемент XML для печати до последнего элемента предыдущего брата - PullRequest
2 голосов
/ 14 марта 2011

Пожалуйста, мне нужна твоя помощь !!

Мне нужна таблица стилей XSL, которая позволяет переместить элемент XML для печати перед последним элементом предыдущего брата ( или это может быть ).Мое утверждение if:

IF ( или ) и существуют в XML, затем ПЕРЕМЕЩАЙТЕ для печати ДО ( или ) ПРОЧИЕ просто.

Я пробовал несколько вещей, но я просто не могу заставить его печатать раньше или в некоторых файлах, это .

XML выглядит следующим образом:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

Я хочу, чтобы мой вывод был таким, если существует вышеуказанное условие:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

Может ли кто-нибудь помочь мне, как этого добиться?

Заранее спасибо !!

Линда

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Это преобразование:

<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()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match=
 "/*/*[1]/*[not(self::tools or self::parts)]
             [not(preceding-sibling::*[self::tools or self::parts])]
                                         [last()]">
  <xsl:call-template name="identity"/>
  <xsl:copy-of select="../following-sibling::*[1]/planning"/>
 </xsl:template>
 <xsl:template match="planning"/>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <planning>Text for Planning</planning>
        <p>blah blah blah</p>
    </main>
</work>

дает именно нужный, правильный результат:

<work>
   <prelim>
      <code>ABC</code>
      <source>DEF</source>
      <planning>Text for Planning</planning>
      <tools>Includes codes for a table</tools>
   </prelim>
   <main>
      <p>blah blah blah</p>
   </main>
</work>

Объяснение

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

  2. Два шаблона переопределяют правило идентификации - один для предотвращения «копирования на месте» planning, другой для фактической операции перемещения.

  3. Переопределяющий шаблон, который выполняет операцию перемещения, имеет следующие свойства:

    Соответствует любому элементу, который: 1) является дочерним по отношению к первому дочернему элементу верхнего элемента, и 2) не является tool или parts, и 3) не имеет предшествующего брата, который является tool или parts, и 4) является последним из любого элемента, который удовлетворяет 1), 2) и 3).

    Действие простое: этот шаблон копирует текущий узел, вызывая правило идентификации по имени. Затем он копирует своего «двоюродного брата» - planning потомка первого родственного элемента своего родительского элемента.

1 голос
/ 14 марта 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:for-each select="../../main/planning">
            <xsl:call-template name="identity"/>
        </xsl:for-each>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
</xsl:stylesheet>

Выход:

<work>
    <prelim>
        <code>ABC</code>
        <source>DEF</source>
        <planning>Text for Planning</planning>
        <tools>Includes codes for a table</tools>
    </prelim>
    <main>
        <p>blah blah blah</p>
    </main>
</work>

Другой подход с режимами:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="tools[not(preceding-sibling::parts)]|
                         parts[not(preceding-sibling::tools)]">
        <xsl:apply-templates select="../../main/planning" mode="copy"/>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="planning"/>
    <xsl:template match="node()|@*" mode="copy">
        <xsl:call-template name="identity"/>
    </xsl:template>
</xsl:stylesheet>
...