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