Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 删除节点和具有位置值的ID属性_Xslt_Xpath_Xslt 1.0 - Fatal编程技术网

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

Xslt 删除节点和具有位置值的ID属性,xslt,xpath,xslt-1.0,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=

我有一个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>

文本
文本
文本
文本
我必须删除属性类型为“y”的行,属性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值,即使删除了任何类型的行,它也应该是递增的,例如在本例中它是“y”。





我必须删除属性类型为“y”且属性id为的行 值应按增量顺序排列

我建议你这样做:

XSLT1.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>

我必须删除属性类型为“y”且属性id为的行 值应按增量顺序排列

我建议你这样做:

XSLT1.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>

我必须删除属性类型为“y”且属性id为的行 值应按增量顺序排列

我建议你这样做:

XSLT1.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>

我必须删除属性类型为“y”且属性id为的行 值应按增量顺序排列

我建议你这样做:

XSLT1.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>


您有几个问题,其中包括:•您的输出没有根元素;•这:
@*[.!='id']
不选择任何内容,因为没有包含字符串
id
的属性;此外,这是不必要的,因为您正在覆盖属性;•将每个实例计数到前面的节点是低效的;最好尽可能使用xsl:number或position()您的输出包含已删除行的文本值,这是由于应用了内置模板。@*[.!='id']-是的,我的错。应该使用name()position()/xsl:number-在本例中不是这样,因为模板是在所有行元素的上下文中调用的。类型为“y”的节点未被删除,id具有2、4、6、8等值。。。。有什么想法吗?嗨,现在成功了。我刚搬走了。感谢各位,这是一个巨大的帮助,非常感谢。您有几个问题,其中包括:•您的输出没有根元素;•这:
@*[.!='id']
不选择任何内容,因为没有包含字符串
id
的属性;此外,这是不必要的,因为您正在覆盖属性;•将每个实例计数到前面的节点是低效的;最好尽可能使用xsl:number或position()您的输出包含已删除行的文本值,这是由于应用了内置模板。@*[.!='id']-是的,我的错。应该使用name()position()/xsl:number-在本例中不是这样,因为模板是在所有行元素的上下文中调用的。类型为“y”的节点未被删除,id具有2、4、6、8等值。。。。有什么想法吗?嗨,现在成功了。我刚搬走了。感谢各位,这是一个巨大的帮助,非常感谢。您有几个问题,其中包括:•您的输出没有根元素;•这:
@*[.!='id']
不选择任何内容,因为没有包含字符串
id
的属性;此外,这是不必要的,因为您正在覆盖属性;•将每个实例计数到前面的节点是低效的;最好尽可能使用xsl:number或position()您的输出包含已删除行的文本值,这是由于应用了内置模板。@*[.!='id']-是的,我的错。应该使用name()position()/xsl:number-在本例中不是这样,因为模板是在所有行元素的上下文中调用的。类型为“y”的节点未被删除,id具有2、4、6、8等值。。。。有什么想法吗?嗨,现在成功了。我刚搬走了。感谢各位,这是一个巨大的帮助,非常感谢。您有几个问题,其中包括:•您的输出没有根元素;•这:
@*[.!='id']
不选择任何内容,因为没有包含字符串
id
的属性;此外,这是不必要的,因为您正在覆盖属性;•将每个实例计数到前面的节点是低效的;最好尽可能使用xsl:number或position()您的输出包含已删除行的文本值,这是由于应用了内置模板。@*[.!='id']-是的,我的错。应该使用name()position()/xsl:number-在本例中不是这样,因为模板是在所有行元素的上下文中调用的。类型为“y”的节点未被删除,id具有2、4、6、8等值。。。。有什么想法吗?嗨,现在成功了。我刚搬走了。谢谢大家,这是一个很大的帮助,非常感谢。你能解释一下为什么position()会在这个解决方案中返回正确的值,但是如果你在初始tem中使用position()的话就不会了吗