0

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

请注意,有些转换产生 XML,有些产生纯文本。

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

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

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

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

如果我能以某种方式使我的 XSLT 仅在有数据要输出的情况下输出文档类型,那可能会更好。我尝试将<xsl:output>节点放在节点内<xsl:if>,但这不起作用。

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

4

4 回答 4

1

如果您使用XSLT 2.0,那么您可以使用xsl:result-document编写结果文档,并且您可以动态决定是否编写它。(也总会有一个主输出,但您可以将其定向到 /dev/null)。

于 2013-09-26T21:14:21.780 回答
1

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

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

于 2013-09-26T19:49:03.217 回答
0

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

于 2013-09-27T04:26:46.270 回答
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>正如您已经注意到的,它不能放在 中。请参阅XSLT 1.0 中的条件 <xsl:output>?进行相关讨论。

在 XML 文档中包含 XML 声明是一种很好的做法,但这不是强制性的。因此,纯粹的 XSLT 选项是始终省略 XML 声明。

于 2013-09-26T19:26:35.683 回答