诱使XSL解释具有特定属性为null或空的XML元素

时间:2019-02-27 15:53:21

标签: xml xslt xslt-2.0

这里是Java 8,但我认为这没有什么区别,因为我相信这是一个纯粹的XSL问题。

我有一些代码可以生成以下XML(例如):

<fizz>
  <account>10016</account>
  <accountId>2000001347</accountId>
  <buzz class="null"/>
</fizz>

运行时buzz元素的值存在3种潜在情况:

  • “空类嗡嗡声”-> <buzz class="null"/>;或
  • “非空类嗡嗡声”-> <buzz class="anythingOtherThanNull"/>;或
  • “正常蜂鸣”-> <buzz><complicatedXmlStructureInsideOfHere</buzz>

因此,在运行时,我们可能会收到“空类Buzz”,“非空类Buzz”或“普通Buzz”。 在“空类嗡嗡声”的情况下,我不想转换buzz元素。(但我 do 想要转换非空类嗡嗡声,正常的Buzz变化。)

这是我的XSL转换:

<xsl:stylesheet version="2.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="/fizz">
      <foobar>
        <xsl:copy-of select="account"/>
        <logId><xsl:value-of select="accountId"/></logId>
        <xsl:if test="buzz">
          <FLIMFLAM SEGMENT="1">
            <HAPP>003</HAPP>
            <SADD><xsl:value-of select="buzz"/></SADD>
          </FLIMFLAM>
        </xsl:if>
      <foobar>
    </xsl:template>

</xsl:stylesheet>

问题在于,这会转换Null类Buzz变体并产生:

<foobar>
  <account>10016</account>
  <logId>2000001347</logId>
  <FLIMFLAM SEGMENT="1">
    <HAPP>003</HAPP>
    <SADD/>
  </FLIMFLAM>
</foobar>

在Null Class Buzz的情况下,我希望buzz被完全忽略:

<foobar>
  <account>10016</account>
  <logId>2000001347</logId>
</foobar>

有什么想法可以做到这一点吗?预先感谢!

1 个答案:

答案 0 :(得分:1)

如评论中所述:

<xsl:if test="buzz[not(@class='null')]">
当至少有一个{strong>不具有包含字符串buzz的{​​{1}}属性的class元素时,

将返回true。