XSL | Сортировка через поиск документа - PullRequest
1 голос
/ 10 января 2012

gulp Первое сообщение ....

Ситуация

Я использую два XML-файла для своего XSL-преобразования.File1 обрабатывает хранилище, а File2 хранит информацию о расположении.

Данные

<item id="1100326">
   <node1> ... </node1>
   [...]
</item>

Макет

 <topnews>
    <item vieworder="1">1100326</item>
    <item vieworder="2">1100724</item>
 </topnews>

Мне удалось «извлечь» узлы, перечисленные в layout-XML, исключительно:

<xsl:for-each select="item[@id=document($document)//topnews/item]" />

Проблема

У меня серьезные проблемы с сортировкой данных с помощью атрибута vieworder из layoutXML.Буду признателен за любую помощь и готов учиться у мастеров!:)

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Можете ли вы использовать XSLT 2.0 (поддерживается Saxon 9 или AltovaXML)?

С этим вы можете просто сделать, например,

<xsl:variable name="layout-doc" select="document('layout.xml')"/>

<xsl:key name="k1" match="topnews/item" use="."/>

<xsl:template match="/">
  <xsl:for-each select="//item[key('k1', @id, $layout-doc)]">
    <xsl:sort select="xs:integer(key('k1', @id, $layout-doc)/@vieworder)"/>
  </xsl:for-each>
</xsl:template>
0 голосов
/ 10 января 2012

+ 1 за хороший первый вопрос. Вот как бы я это сделал ....

data.xml

<doc>
  <item id="1100724">
    <node1>Should be second.</node1>
  </item>
  <item id="1100326">
    <node1>Should be first.</node1>
  </item>
</doc>

layout.xml

<topnews>
  <item vieworder="1">1100326</item>
  <item vieworder="2">1100724</item>
</topnews>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/doc">
    <doc>
      <xsl:apply-templates select="item">
        <xsl:sort select="document('layout.xml')/topnews/item[.=current()/@id]/@vieworder" data-type="number"/>
      </xsl:apply-templates>      
    </doc>
  </xsl:template>

</xsl:stylesheet>

output.xml

<doc>
   <item id="1100326">
      <node1>Should be first.</node1>
   </item>
   <item id="1100724">
      <node1>Should be second.</node1>
   </item>
</doc>
...