选择属性不同的几个元素之一

Num*_*ats 5 xslt conditional attributes

我是一名经验丰富的程序员,但他是XSLT的新手,我发现它非常令人困惑.如果这是一个之前被问过的问题我很抱歉,但我对XSLT感到非常沮丧,我甚至不确定要搜索什么...

我有一个问题,如果某个XML元素只出现一次,我想要它的内容输出,但如果它多次出现,我只想要那些具有某个属性的内容.

例如,假设我有一个包含的XML文件(称为"文件1")

<food>
    <snack>Chips</snack>
    <snack type="nuts">Peanuts</snack>
</food>
Run Code Online (Sandbox Code Playgroud)

和另一个包含的XML文件("文件2")

<food>
    <snack>Cheese puffs</snack>
</food>
Run Code Online (Sandbox Code Playgroud)

我需要一个XSLT,在处理文件1时只输出"Peanuts"(但不是"Chips"),但仍然为文件2输出"Cheese puffs"(即我不能只选择那些具有"type"属性的元素) , 那太简单了).

这可能很简单,但我被困了......

Dim*_*hev 1

这种转变

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

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
   "*[snack/@type]/snack[not(@type)]"/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

在这两种情况下都会产生想要的结果

解释

  1. 身份规则/模板“按原样”复制每个节点

  2. 第二个模板将覆盖任何snack不带属性且type兄弟snack元素具有属性的元素的标识模板type。该模板具有空主体,可有效地从(复制到)输出中“删除”匹配的元素。