【问题标题】:Generate Sequence number for nested loops for xsl transformation为 xsl 转换的嵌套循环生成序列号
【发布时间】:2021-04-21 07:49:29
【问题描述】:

我想通过 xsl 转换输入的 xml。我想在嵌套循环中生成书号,但 Position() 函数只返回内部循环内节点的值。使用 xslt 2.0

使输入格式正确

输入:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:z="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
<Library>
    <LibraryName>Berlin Central Library</LibraryName>
    <Books>
        <BookName>Harry Potter</BookName>
    </Books>
    <Books>
        <BookName>Lord of the Rings</BookName>
    </Books>
</Library>
<Library>
<LibraryName>London Central Library</LibraryName>
    <Books>
    <BookName>The alchemist</BookName>
    </Books>
    <Books>
    <BookName>The detective</BookName>
    </Books>
</Library>
<Library>
<LibraryName>Delhi Central Library</LibraryName>
    <Books>
    <BookName>The Discovery of India</BookName>
    </Books>
</Library>
</xsl:stylesheet>

预期输出:

<Book>
    <Library Name>Berlin Central Library</Library Name>
    <Book Number>1</Book Number>
    <Book Name>Harry Potter</Book Name>
</Book>
<Book>
    <Library Name>Berlin Central Library</Library Name>
    <Book Number>2</Book Number>
    <Book Name>Lord of the Rings</Book Name>
</Book>
<Book>
    <Library Name>London Central Library</Library Name>
    <Book Number>3</Book Number>
    <Book Name>The alchemist</Book Name>
</Book>
<Book>
    <Library Name>London Central Library</Library Name>
    <Book Number>4</Book Number>
    <Book Name>The detective</Book Name>
</Book>
<Book>
    <Library Name>Delhi Central Library</Library Name>
    <Book Number>5</Book Number>
    <Book Name>The Discovery of India</Book Name>
</Book>

【问题讨论】:

  • &lt;Book Number&gt;4&lt;/Book Number&gt; 甚至不是格式良好的 XML 元素标记。 Library NameBook Name 都不是。如果你嵌套的loop 没有给你position() 的结果,你为什么不能直接处理Books 元素呢?
  • 使输入格式正确。将此示例创建为无法共享原始 xml。在书籍元素中。位置功能重置,例如“侦探”将书号为 2 而不是需要的 4
  • 不确定“嵌套循环”是什么意思。根据猜测发布答案。下次发布您的代码。

标签: xml xslt xslt-2.0


【解决方案1】:

考虑到格式良好的输入,您可以通过以下两种方法:

XML

<root>
    <Library>
        <LibraryName>Berlin Central Library</LibraryName>
        <Books>
            <BookName>Harry Potter</BookName>
        </Books>
        <Books>
            <BookName>Lord of the Rings</BookName>
        </Books>
    </Library>
    <Library>
    <LibraryName>London Central Library</LibraryName>
        <Books>
        <BookName>The alchemist</BookName>
        </Books>
        <Books>
        <BookName>The detective</BookName>
        </Books>
    </Library>
    <Library>
    <LibraryName>Delhi Central Library</LibraryName>
        <Books>
        <BookName>The Discovery of India</BookName>
        </Books>
    </Library>
</root>

XSLT 选项 1

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

<xsl:template match="/root">
    <root>
        <xsl:for-each select="Library/Books">
            <Book>
                <xsl:copy-of select="../LibraryName"/>
                <BookNumber>
                    <xsl:value-of select="position()"/>
                </BookNumber>
                <xsl:copy-of select="BookName"/>
            </Book>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

XSLT 选项 2

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

<xsl:template match="/root">
    <root>
        <xsl:for-each select="Library">
            <xsl:variable name="lib" select="LibraryName"/>
            <xsl:for-each select="Books">
                <Book>
                    <xsl:copy-of select="$lib"/>
                    <BookNumber>
                        <xsl:number level="any"/>
                    </BookNumber>
                    <xsl:copy-of select="BookName"/>
                </Book>
            </xsl:for-each>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2017-08-08
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2012-11-06
    相关资源
    最近更新 更多