基于计数的迭代或 XSL 中的复制。我该怎么做?

发布于 2024-09-01 16:12:15 字数 2357 浏览 5 评论 0原文

我正在尝试从 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>

我需要获取“books”中找到的值,然后复制文本行一定次数。结果如下所示:

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>

任何帮助将不胜感激。对于初学者来说,“迭代”是正确的术语吗?

谢谢!

I'm trying to create an inventory list (tab-delimited text, for the output) from XML data. The catch is, I need to take the line that I created, and list it multiple times (iterate ???), based on a number found in the XML. So, from the XML below:

<?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>

I need to take the value found in "books", and then copy the text line that number of times. The result looking like this:

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   

So that the inventory taker, can then write in the titles found on each shelf. I have the basic structure of my XSL, but I'm not sure how to do the "iteration" portion.

<?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="'	'"/>
<xsl:variable name="newline" select="'
'"/>

<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>

Any help would be greatly appreciated. For starters, is "iteration" the right term to be using for this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

⒈起吃苦の倖褔 2024-09-08 16:12:15

还有一个更简单的 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
<xsl:text/>
    <xsl:apply-templates/>
  </xsl:template>

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

    <xsl:for-each select="1 to xs:integer(books)">
      <xsl:value-of select="concat($vText, '
')"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

And an even simpler XSLT 2.0 non-recursive solution:

<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
<xsl:text/>
    <xsl:apply-templates/>
  </xsl:template>

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

    <xsl:for-each select="1 to xs:integer(books)">
      <xsl:value-of select="concat($vText, '
')"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
抱猫软卧 2024-09-08 16:12:15

这是一个简单的递归 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
<xsl:text/>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="aisle">
   <xsl:call-template name="makeRows">
     <xsl:with-param name="pText"
     select="concat(@label, '	', row, '	', 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, '
')"/>

    <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

Here is a simple, recursive XSLT 1.0 solution:

<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
<xsl:text/>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="aisle">
   <xsl:call-template name="makeRows">
     <xsl:with-param name="pText"
     select="concat(@label, '	', row, '	', 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, '
')"/>

    <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>

When this transformation is applied on the provided XML document:

<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>

the wanted, correct result is produced:

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
唐婉 2024-09-08 16:12:15
<xsl:param name="pNumRows" select="0"/>

写它 0

我认为它会起作用

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

write it <xsl:param name="pNumRows">0</xsl:param>

i think it will work

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文