使用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>
答案 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>
答案 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>