【问题标题】:Delete XSL output file generation at runtime在运行时删除 XSL 输出文件生成
【发布时间】:2012-05-30 12:44:04
【问题描述】:

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

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

但如果内容不可用(不满足“”条件),则输出文件将是一个空文件。

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

任何人有任何线索?

不会有帮助,因为它确实会生成输出,但只会终止 XSL 的进一步处理。

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

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

【问题讨论】:

  • 在不提供任何代码的情况下很难提供具体的帮助。

标签: java exception xslt runtime


【解决方案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>

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

更好的解决方案

<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 最显着的特性。

【讨论】:

  • 非常感谢您抽出宝贵时间,先生,我需要的是避免在运行时在 else 部分中生成输出文件。我有一些感觉,这在 XSL 中无法完成,但会为我们所有人提供一个很好的话题来思考。即使我们可以在 Java 端解决这个问题,我们也非常感谢您的帮助。再次感谢:)
  • @dilruk:鉴于提供的信息,我已尽最大可能回答了您的问题。如果您觉得这不能解决您的问题,请编辑问题并给出一个完整(尽可能小)的真实示例。不要让人们试图猜测问题出在哪里。
  • 我需要的是避免在运行时生成输出文件。 [检查条件后]假设我想检查上面的 xml 文件中是否存在数字 11。如果它不存在,我不想有一个输出文件,因为我只需要具有 num 11 的文件。因为在那之后我可以假设所有正在生成的输出文件都具有 num 11,所以我可以做进一步的处理无需在 java 端进行进一步过滤。
  • @dilruk:我现在明白了……您能编辑问题并在那里解释一下吗?从 cmets 可以看出,其他人也很困惑。这个问题在 XSLT 2.0 中有一个很好的解决方案——你可以使用 XSLT 2.0 处理器吗?
  • 哇!听到这个消息真的很惊讶,也很期待。我想我可以得到 XSLT2.0 的使用。如果您能告诉我在以前的版本中是否也有任何解决方案,我会很高兴。我在此链接中添加了一个新问题,对于给您带来的麻烦,我深表歉意。但真的很感谢你的承诺:) stackoverflow.com/questions/10823145/…
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2019-08-19
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
相关资源
最近更新 更多