我正在使用一些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>
节点内,但这不起作用。
获得我需要的结果的好方法是什么?
答案 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声明。