如何使XSLT有条件地输出没有DOCTYPE的空白文件?

时间:2013-09-26 19:07:40

标签: .net xml xslt

我正在使用一些XSLT转换。这些转换必须每天以自动方式应用于数千个XML文档。生成的文件应输出到目标目录。

请注意,某些转换会生成XML,而某些转换会生成纯文本。

我有一个新的要求,当输入XML包含某些值时,某些XSLT转换根本不会产生任何输出,也不会写入任何文件。

我在.net中处理来自XSLT的输出,所以对于产生文本的XSLT,我只是检查结果输出是空白还是只有空格;在这种情况下,我没有写任何文件,一切都很完美。

当我尝试识别XSLT中产生XML的空白输出时出现问题,因为即使我指定不应在我的xsl:template块中输出任何内容,输出也将包含XML doctype <?xml version="1.0" encoding="UTF-8"?>即使该文件是空白的。

问题的一个解决方案是让我的.net代码过滤掉仅包含XML文档类型的文档,但我不确定最好的方法是什么。到目前为止,我已经尝试了xml.Trim().StartsWith("<?xml") && xml.Trim().EndsWith("?>"),但我不知道它是如何防弹的。

如果有输出数据,我可能会以某种方式使我的XSLT输出成为doctype可能会更好。我尝试将<xsl:output>节点放在<xsl:if>节点内,但这不起作用。

获得我需要的结果的好方法是什么?

4 个答案:

答案 0 :(得分:1)

  

我有一个新要求,当输入XML 包含某些值时,某些XSLT转换根本不会产生任何输出,也不会写入任何文件。

我要做的是有条件地执行变换本身。在运行转换之前检查XML文件。如果输入指示不应创建任何文件,请不要运行转换。

答案 1 :(得分:1)

如果您使用 XSLT 2.0 ,则可以使用 xsl:result-document 编写结果文档,然后您可以动态决定是否编写结果文档。 (总会有一个主输出,但你可以将它指向/ dev / null)。

答案 2 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>不是“DOCTYPE”。这是一个XML声明:http://www.w3.org/TR/xml/#sec-prolog-dtd

如果要省略XML声明,请使用

<xsl:output omit-xml-declaration = "yes"/> 
样式表中的

。它适用于XSLT 1.0和2.0。参考文献:

请注意,<xsl:output>是样式表模块中的顶级元素。正如您已经注意到的那样,它不能放在<xsl:if>中。有关相关讨论,请参阅Condition <xsl:output> in XSLT 1.0?

最好在XML文档中使用XML声明,但这不是强制性的。所以纯XSLT选项总是省略XML声明。

答案 3 :(得分:0)

我认为mzjn的答案可能是最好的(总是省略声明)。但是,如果您需要声明,可以在omit-xml-declaration="yes"标记中使用<xsl:output>,但是只需在<xsl:text>顶部有条件地编写XML声明。