Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
Xml XSLT筛选并选择第一个元素_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml XSLT筛选并选择第一个元素

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>

我有一个xml文件,如:

<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() &gt; 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() &gt; 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]"/>


我的情况略有不同,但谢谢,我明白了要点。默认情况下,我复制了所有节点,并删除了复制所有模板之外不需要的节点。所以我不得不用两句话:我的情况略有不同,但谢谢,我明白了要点。默认情况下,我复制了所有节点,并删除了复制所有模板之外不需要的节点。所以我不得不用两行字:和