删除具有位置值的节点和ID属性

时间:2015-07-02 11:58:29

标签: xslt xpath xslt-1.0

我有一个XML文件:

<ROWS>
<ROW type="x" id="1">
<Test>text</Test>
</ROW>
<ROW type="x" id="1">
<Test>text</Test>
</ROW>
<ROW type="y" id="2">
<Test>text</Test>
</ROW>
<ROW type="x" id="3">
<Test>text</Test>
</ROW>
</ROWS>

我必须删除属性类型&#34; y&#34;和属性id值应按递增顺序:

<ROWS>
    <ROW type="x" id="1">
    <Test>text</Test>
    </ROW>
    <ROW type="x" id="2">
    <Test>text</Test>
    </ROW>
    <ROW type="x" id="3">
    <Test>text</Test>
    </ROW>
    </ROWS>

我尝试使用以下XSLT:

<xsl:template match="ROWS/ROW[not(@type = 'y')]">
        <xsl:variable name="RowID">
            <xsl:number/>
        </xsl:variable>
        <ROW id="{$RowID}" type="{@type}">
            <xsl:apply-templates/>
        </ROW>
    </xsl:template>
    <xsl:template match="ROW[@type='y']"/>

但它没有用,我也使用优先功能但没有成功。

有人可以帮忙吗?最重要的部分是id值,即使在删除任何类型的Row之后它也应该是递增的,例如在这种情况下它是&#34; y&#34;。

2 个答案:

答案 0 :(得分:2)

  

我必须删除属性类型&#34; y&#34;和属性id   值应按递增顺序

我建议你这样试试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ROWS">
    <xsl:copy>
        <xsl:apply-templates select="ROW[not(@type='y')]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ROW">
    <ROW type="{@type}" id="{position()}">
        <xsl:copy-of select="node()"/>
    </ROW>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

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

  <xsl:template match="/ROWS">
        <xsl:copy>
            <xsl:apply-templates select="ROW[@type!='y']"/>
        </xsl:copy>
  </xsl:template>

    <xsl:template match="ROW">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="id">
                <!-- here were have only proper elements in context, that's why we can use position() -->
                <xsl:value-of select="position()"/>
            </xsl:attribute>
            <xsl:copy-of select="*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>