XSLT:请告知如何在下面创建嵌套的XLST输出

时间:2018-03-23 20:26:26

标签: loops xslt nested-loops

要求是将两个参数传递给XSLT。参数是Page Count和Detail Count。

请告知。

请查看下面的输出结构,如果您需要更多更新,请与我们联系。

在以下示例中,参数值为Page Count = 1且Detail Count = 3;

<?xml version = "1.0" encoding = "UTF-8"?>
<LayOut>
    <Pages>
        <Page>1</Page>
        <Detail>1</Detail>
        <Detail>2</Detail>
        <Detail>3</Detail>
    </Pages>
    <Pages>
        <Page>2</Page>
        <Detail>4</Detail>
        <Detail>5</Detail>
        <Detail>6</Detail>
    </Pages>
    .
</LayOut>

2 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="LayOut">
<LayOut>
    <Pages>
<xsl:element name="Page">
<xsl:attribute name="count">
<xsl:value-of select="count(//Page)"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="Detail">
<xsl:attribute name="count">
<xsl:value-of select="count(//Detail)"/>
</xsl:attribute>
</xsl:element>

    </Pages>
</LayOut>


</xsl:template>
</xsl:transform>

答案 1 :(得分:0)

Input:

<?xml version="1.0" encoding="UTF-8"?>
<pages>
    <page count="2"/>
    <detail count="6"/>
</pages>

XSL Code:

 <?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" version="2.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="pages">
            <layout>
                <xsl:call-template name="pg"/>
            </layout>
        </xsl:template>
        <xsl:template name="pg">
            <xsl:param name="pg" select="page/@count"/>
            <xsl:param name="dt1" select="floor(detail/@count div 2)"/>
            <xsl:param name="dt" select="1"/>
            <pages>
                <page>
                    <xsl:value-of select="$dt"/>
                </page>
                <xsl:call-template name="dt"> </xsl:call-template>
            </pages>
            <xsl:if test="$pg > 1">
                <xsl:call-template name="pg">
                    <xsl:with-param name="pg" select="$pg - 1"/>
                    <xsl:with-param name="dt" select="$dt + 1"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:template>
        <xsl:template name="dt">
            <xsl:param name="dt1" select="floor(detail/@count div 2)"/>
            <xsl:param name="dt" select="1"/>
            <detail>
                <xsl:value-of select="$dt"/>
            </detail>
            <xsl:if test="$dt1 > 1">
                <xsl:call-template name="dt">
                    <xsl:with-param name="dt1" select="$dt1 - 1"/>
                    <xsl:with-param name="dt" select="$dt + 1"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:template>
    </xsl:stylesheet>