1

我正在编写使用 XSL 读取 XML 文件的文本输出文件。

在这里,我正在尝试检查源 XML 中是否有特定内容的天气,并将该内容写入文件(如果有)。

但是如果内容不可用(不满足“<XSL:if>”条件),那么输出文件将是一个空文件。

所以我想添加一个 else 条件并在那个 else 条件中避免在运行时创建 XSL 输出文件。

任何机构有任何线索?

<xsl:message terminate="yes"> 不会有帮助,因为它确实会生成输出,但只会终止 XSL 的进一步处理。

即使在创建文件后不删除文件,任何机构都可以帮助甚至建议在 java 代码中采用任何其他方法。[通过阅读它们并识别空文件]

目前我正在使用 java 来读取创建的空文件并明确删除它们。提前致谢。

4

1 回答 1

1

我将举两个例子来说明如何做到这一点——第二个是我推荐的:

假设我们有这个 XML 文档:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

我们想从中产生另一个,其中num偶数的元素被“删除”。

一种方法是

<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="/*">
     <nums>
       <xsl:apply-templates/>
     </nums>
 </xsl:template>

 <xsl:template match="num">
  <xsl:choose>
   <xsl:when test=". mod 2 = 1">
     <num><xsl:value-of select="."/></num>
   </xsl:when>
   <!-- <xsl:otherwise/> -->
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

产生了想要的结果

<nums>
   <num>01</num>
   <num>03</num>
   <num>05</num>
   <num>07</num>
   <num>09</num>
</nums>

请注意:对于“不做任何事情”,您甚至不需要<xsl:otherwise>它,它已被注释掉。

更好的解决方案

<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="num[. mod 2 = 0]"/>
</xsl:stylesheet>

这会产生相同的正确结果。

在这里,我们使用模板匹配num具有偶数值和空主体的元素来覆盖身份规则——它执行“删除”。

请注意

这里我们根本不使用任何“if-then-else”显式指令——只是 Xtemplate 模式匹配,这是 XSLT 最显着的特性。

于 2012-05-30T12:59:02.050 回答