Оси XPath уважают сортировку Xslt? - PullRequest
4 голосов
/ 05 марта 2011

Если я назову шаблон xslt примерно так:

  <xsl:template match="hist:Steps">
    <dgml:Links>
      <xsl:apply-templates select="hist:Step">
        <xsl:sort data-type="text" select="hist:End" order="ascending"/>
      </xsl:apply-templates>
    </dgml:Links>
  </xsl:template>

Будет ли ось following-sibling в шаблоне ниже запрашивать порядок документов или отсортированный порядок?

  <xsl:template match="hist:Step">
    <xsl:if test="following-sibling::hist:Step">
      <dgml:Link>
        <xsl:attribute name="Source">
          <xsl:value-of select="hist:Workstation"/>
        </xsl:attribute>

        <xsl:attribute name="Target">
          <xsl:value-of select="following-sibling::hist:Step/hist:Workstation"/>
        </xsl:attribute>

      </dgml:Link>
    </xsl:if>
  </xsl:template>

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Оси XPath отражают отношения узла во входном дереве (или временном дереве, если узел находится во временном дереве). Они не имеют ничего общего с порядком обработки (следующий узел узла не обязательно является даже одним из узлов, выбранных для обработки).

Это отличается от position () - распространенная ошибка - думать, что position () что-то говорит вам о позиции узла в его дереве, но на самом деле это позиция узла в списке узлов, выбранных для обработки.

3 голосов
/ 05 марта 2011

XSLT берет дерево ввода и преобразует его в дерево результатов, ваши выражения пути всегда работают с деревом ввода, поэтому любые искомые братья и сестры перемещаются в дереве ввода. С XSLT 2.0 (или с XSLT 1.0 и функцией расширения, такой как exsl: node-set http://www.exslt.org/exsl/index.html), вы можете создавать переменные с временными деревьями, которые затем можно перемещать, например,

<xsl:variable name="rtf1">
    <xsl:for-each select="hist:Step">
      <xsl:sort data-type="text" select="hist:End" order="ascending"/>
      <xsl:copy-of select="."/>
    </xsl:for-each>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf1)/hist:Step"/>

будет затем обрабатывать временный набор узлов элементов Step, которые были отсортированы.

С XSLT 2.0 вам не нужен вызов exsl: node-set.

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