Итерация или копирование в XSL на основе подсчета. Как мне это сделать? - PullRequest
4 голосов
/ 12 мая 2010

Я пытаюсь создать список инвентаря (текст с разделителями табуляцией, для вывода) из данных XML. Суть в том, что мне нужно взять созданную мной строку и перечислить ее несколько раз (повторять ???), основываясь на числе, найденном в XML. Итак, из приведенного ниже XML:

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <aisle label="AA">
    <row>bb</row>
    <shelf>a</shelf>
    <books>4</books>
  </aisle>
  <aisle label="BB">
    <row>cc</row>
    <shelf>d</shelf>
    <books>3</books>
  </aisle>
</library>

Мне нужно взять значение из "книг", а затем скопировать текстовую строку столько раз. Результат выглядит так:

Aisle   Row Shelf   Titles
AA     bb   a   
AA     bb   a   
AA     bb   a   
AA     bb   a   
BB     cc   d   
BB     cc   d   
BB     cc   d   

Так что берущий инвентарь может потом написать в названиях, найденных на каждой полке. У меня есть базовая структура моего XSL, но я не уверен, как выполнить часть «итерации».

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" version="2.0">

<xsl:output omit-xml-declaration="yes"/>
<xsl:variable name="tab" select="'&#09;'"/>
<xsl:variable name="newline" select="'&#10;'"/>

<xsl:template match="/">
    <!-- Start Spreadsheet header -->
    <xsl:text>Aisle</xsl:text>
    <xsl:value-of select="$tab"/>
    <xsl:text>Row</xsl:text>
    <xsl:value-of select="$tab"/>
    <xsl:text>Shelf</xsl:text>
    <xsl:value-of select="$tab"/>
    <xsl:text>Titles</xsl:text>
    <xsl:value-of select="$newline"/>
    <!-- End spreadsheet header -->

    <!-- Start entering values from XML -->
    <xsl:for-each select="library/aisle">
        <xsl:value-of select="@label"/>
        <xsl:value-of select="$tab"/>
        <xsl:value-of select="row"/>
        <xsl:value-of select="$tab"/>
        <xsl:value-of select="shelf"/>
        <xsl:value-of select="$tab"/>
        <xsl:value-of select="$tab"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each>
    <!-- End of values from XML -->

    <!-- Iteration of the above needed, based on count value in "books" -->

</xsl:template>
</xsl:stylesheet>

Любая помощь будет принята с благодарностью. Для начала, является ли «итерация» правильным термином для этого?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

И еще более простое нерекурсивное решение XSLT 2.0:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="xs" 
  >
  <xsl:output method="text"/>

  <xsl:template match="/*">
    Aisle   Row Shelf   Titles&#xA;<xsl:text/>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="aisle">
    <xsl:variable name="vText" select=
      "concat(@label, '&#9;', row, '&#9;', shelf)"
    />

    <xsl:for-each select="1 to xs:integer(books)">
      <xsl:value-of select="concat($vText, '&#xA;')"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 24 января 2011
<xsl:param name="pNumRows" select="0"/>

напиши <xsl:param name="pNumRows">0</xsl:param>

Я думаю, что это будет работать

1 голос
/ 13 мая 2010

Вот простое рекурсивное решение XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
Aisle   Row Shelf   Titles&#xA;<xsl:text/>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="aisle">
   <xsl:call-template name="makeRows">
     <xsl:with-param name="pText"
     select="concat(@label, '&#9;', row, '&#9;', shelf)"/>
     <xsl:with-param name="pNumRows" select="books"/>
   </xsl:call-template>
 </xsl:template>

 <xsl:template name="makeRows">
  <xsl:param name="pText"/>
  <xsl:param name="pNumRows" select="0"/>

  <xsl:if test="$pNumRows > 0">
    <xsl:value-of select="concat($pText, '&#xA;')"/>

    <xsl:call-template name="makeRows">
      <xsl:with-param name="pText" select="$pText"/>
      <xsl:with-param name="pNumRows" select="$pNumRows -1"/>
    </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<library>
  <aisle label="AA">
    <row>bb</row>
    <shelf>a</shelf>
    <books>4</books>
  </aisle>
  <aisle label="BB">
    <row>cc</row>
    <shelf>d</shelf>
    <books>3</books>
  </aisle>
</library>

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

Aisle   Row Shelf   Titles
AA  bb  a
AA  bb  a
AA  bb  a
AA  bb  a
BB  cc  d
BB  cc  d
BB  cc  d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...