Xml XSLT筛选并选择第一个元素
我有一个xml文件,如:Xml XSLT筛选并选择第一个元素,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个xml文件,如: <work> <job name="dummy"> <task>template</task> <user>template</user> </job> <job name="unit1"> <task>abc</task> <user>def</user> </job>
<work>
<job name="dummy">
<task>template</task>
<user>template</user>
</job>
<job name="unit1">
<task>abc</task>
<user>def</user>
</job>
<job name="unit2">
<task>abc1</task>
<user>xyz</user>
</job>
</work>
模板
模板
abc
def
abc1
xyz
我想删除所有元素,除了名称不是“dummy”的第一个作业。某些文件可能包含也可能不包含名为“dummy”的作业。所以最终转换后的文件应该是这样的
<work>
<job name="unit1">
<task>abc</task>
<user>def</user>
</job>
</work>
abc
def
如何在xslt中进行筛选和选择?最简单的方法是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
<xsl:copy>
<!-- copy the first job-whose-name-is-not-dummy -->
<xsl:copy-of select="job[not(@name = 'dummy')][1]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果这是一个更大的转变的一部分,另一种思考方法是思考你想要忽略的东西,而不是你想要保留的东西:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- copy everything as-is unless overridden -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- ignore jobs named dummy -->
<xsl:template match="job[@name = 'dummy']" />
<!-- ignore jobs *not* named dummy, apart from the first one -->
<xsl:template match="job[not(@name = 'dummy')][position() > 1]" />
</xsl:stylesheet>
通过这种方式,如果您不想直接复制您想要保留的
作业
元素,您可以定义进一步的模板。最简单的方法是
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/*">
<xsl:copy>
<!-- copy the first job-whose-name-is-not-dummy -->
<xsl:copy-of select="job[not(@name = 'dummy')][1]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果这是一个更大的转变的一部分,另一种思考方法是思考你想要忽略的东西,而不是你想要保留的东西:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- copy everything as-is unless overridden -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- ignore jobs named dummy -->
<xsl:template match="job[@name = 'dummy']" />
<!-- ignore jobs *not* named dummy, apart from the first one -->
<xsl:template match="job[not(@name = 'dummy')][position() > 1]" />
</xsl:stylesheet>
通过这种方式,如果您不想使用希望保留的作业
元素直接复制,您可以定义进一步的模板。您可以使用
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="job[@name = 'dummy'] | job[not(@name = 'dummy')][position() > 1]"/>
您可以使用
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="job[@name = 'dummy'] | job[not(@name = 'dummy')][position() > 1]"/>
我的情况略有不同,但谢谢,我明白了要点。默认情况下,我复制了所有节点,并删除了复制所有模板之外不需要的节点。所以我不得不用两句话:我的情况略有不同,但谢谢,我明白了要点。默认情况下,我复制了所有节点,并删除了复制所有模板之外不需要的节点。所以我不得不用两行字:和