Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Java 在运行时删除XSL输出文件生成_Java_Exception_Xslt_Runtime - Fatal编程技术网

Java 在运行时删除XSL输出文件生成

Java 在运行时删除XSL输出文件生成,java,exception,xslt,runtime,Java,Exception,Xslt,Runtime,我正在编写文本输出文件,并使用XSL读取XML文件 在这里,我试图检查源XML中是否有特定内容可用,并将该内容写入文件(如果可用) 但如果内容不可用(不满足“”条件),则输出文件将是空文件 所以我想添加一个else条件,并在该else条件中避免在运行时创建XSL输出文件 有人有线索吗 不会有帮助,因为它确实会生成输出,但只会终止XSL的进一步处理 任何人都可以在java代码中提供帮助,甚至建议采取任何其他方法,即使在创建文件后不删除文件。[通过读取并识别空文件] 目前我正在使用java读取创建的

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

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

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

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

有人有线索吗

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

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


目前我正在使用java读取创建的空文件并显式删除它们。非常感谢。

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

<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>
假设我们有这个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>
产生所需结果

<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: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>

01
03
05
07
09
注意事项:对于“什么都不做”您甚至不需要
,并且它被注释掉了

更好的解决方案

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

我将给出两个如何实现这一点的示例——第二个是我推荐的:

<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>
假设我们有这个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>
产生所需结果

<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: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>

01
03
05
07
09
注意事项:对于“什么都不做”您甚至不需要
,并且它被注释掉了

更好的解决方案

<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: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端解决这个问题,我们也非常感谢yur的帮助。再次感谢:)@dilruk:根据提供的信息,我已经尽可能地回答了你的问题。如果你觉得这不能解决你的问题,请编辑问题并给出一个完整(尽可能小)的真实例子。不要让人们试图猜测问题是什么。我需要的是避免在运行时生成输出文件。[检查条件后]假设我想检查上述xml文件中是否有数字11。如果它不存在,我不想有一个输出文件,因为我只需要有num 11的文件。因为在这之后,我可以假设生成的所有输出文件都有num 11,这样我就可以进行进一步的处理,而不必在java端进行进一步的过滤。@dilruk:我现在明白了。。。请你编辑一下这个问题并解释一下好吗?从评论中可以看出,其他人也感到困惑。这个问题在XSLT2.0中有一个很好的解决方案——您能使用XSLT2.0处理器吗?哇!听到这个消息真的很惊讶,真的很期待。我想我可以使用XSLT2.0了。如果您能告诉我在以前的版本中是否也有任何解决方案,我将非常高兴。我在这个链接中添加了一个新问题,非常抱歉给您带来麻烦。但是非常感谢您的承诺:)非常感谢您的时间,先生,我需要的是避免在运行时在else部分中生成输出文件。我有一种感觉,这不能在XSL内部完成,但会为我们所有人带来一个很好的话题。即使我们能够在java端解决这个问题,我们也非常感谢yur的帮助。再次感谢:)@dilruk:根据提供的信息,我已经尽可能地回答了你的问题。如果你觉得这不能解决你的问题,请编辑问题并给出一个完整(尽可能小)的真实例子。不要让人们试图猜测问题是什么。我需要的是避免在运行时生成输出文件。[检查条件后]假设我想检查上述xml文件中是否有数字11。如果它不存在,我不想有一个输出文件,因为我只需要有num 11的文件。因为在这之后,我可以假设生成的所有输出文件都有num 11,这样我就可以进行进一步的处理,而不必在java端进行进一步的过滤。@dilruk:我现在明白了。。。请你编辑一下这个问题并解释一下好吗?从评论中可以看出,其他人也感到困惑。这个问题在XSLT2.0中有一个很好的解决方案——您能使用XSLT2.0处理器吗?哇!听到这个消息真的很惊讶,真的很期待。我想我可以使用XSLT2.0了。如果您能告诉我在以前的版本中是否也有任何解决方案,我将非常高兴。我添加了一个新问题