XSLT 1.0添加元素增量ID

时间:2015-11-07 11:08:12

标签: xml xslt

使用XML:

<Table>
    <Row id=1>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
    <Row id=2>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
</Table>

如何在末尾添加新的Row元素并使用XSLT 1.0增加id属性?源XML可以包含任意数量的Row元素。

<Table>
    <Row id=1>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
    <Row id=2>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
    <Row id=3>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
    <Row id=4>
       <Col1>...</Col1>
       <Col2>...</Col2>
    </Row>
</Table>

2 个答案:

答案 0 :(得分:0)

Table元素编写一个模板,该元素会读出Row[last()]/@id + 1并添加新的Row或者如果需要更多Row s:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:param name="number-of-rows-to-add" select="5"/>

    <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="Table">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            <xsl:call-template name="add-rows">
                <xsl:with-param name="current-index" select="Row[last()]/@id + 1"/>
                <xsl:with-param name="number-of-rows-to-add" select="$number-of-rows-to-add"/>
            </xsl:call-template>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="add-rows">
        <xsl:param name="current-index"/>
        <xsl:param name="number-of-rows-to-add"/>
        <Row id="{$current-index}">
            <Col1>...</Col1>
            <Col2>...</Col2>
        </Row>
        <xsl:if test="$number-of-rows-to-add > 1">
            <xsl:call-template name="add-rows">
                <xsl:with-param name="current-index" select="$current-index + 1"/>
                <xsl:with-param name="number-of-rows-to-add" select="$number-of-rows-to-add - 1"/>                
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:transform>

http://xsltransform.net/3NJ38YX在线。

答案 1 :(得分:0)

这似乎解决了我的问题。我还在看它。不确定原因,但它在xsltransform.net工具中不起作用。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my" version="1.0">

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name='last-id' select="Table/Row[last()]/@id"/>

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

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

            <xsl:for-each select="document('')/*/my:rows/*">
                <xsl:copy>
                    <xsl:attribute name="id"><xsl:value-of select="$last-id + position()"/></xsl:attribute>
                    <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <my:rows>
        <Row>
            <Col1>A</Col1>
            <Col2>B</Col2>
        </Row>
        <Row>
            <Col1>C</Col1>
            <Col2>D</Col2>
        </Row>
        <Row>
            <Col1>E</Col1>
            <Col2>F</Col2>
        </Row>
    </my:rows>
</xsl:transform>