我正在尝试通过xslt创建一个空文件。
输入样本为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Businessman>
<siblings>
<sibling>John </sibling>
</siblings>
<child> Pete </child>
<child> Ken </child>
</Businessman>
当输入包含任何'child'标签时,它应该生成AS IS文件。当输入没有任何'child'标签时,我需要创建一个空文件(0字节文件)。
这就是我的尝试:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="/Businessman/child">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当存在任何“child”标记时,这会使文件保持不变。但是当没有'child'标签时,没有产生任何空文件。
我需要测试的文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Businessman>
<siblings>
<sibling>John </sibling>
</siblings>
</Businessman>
任何帮助都会很棒!
由于
答案 0 :(得分:1)
如果您希望处理器遇到打开输出文件的麻烦,您必须将其写入输出文件。尝试一个空文本节点。你只需要做出决定复制与否?&#39;一旦。
如果不满足条件,只做一次决定并产生空输出的一种方法是用以下代码替换模板:
<xsl:choose>
<xsl:when test="/Businessman/child">
<xsl:apply-templates/>
</
<xsl:otherwise>
<xsl:message terminate="yes">No children in this input, dying ...</
</
</
这与xsltproc一样正常。 (如果您发现自己获得的文件包含XML声明,请尝试调整xsl:output上的参数。)
但是当我发现自己处于类似的情况时(如果条件C成立则执行此转换,否则......),我只是为文档节点添加了一个模板,看起来就像这样:
QProcess
这样我根本没有输出而不是零长度输出。
答案 1 :(得分:0)
足够简单 - 只是不要尝试在一个模板中做所有事情,不要忘记省略xml声明并获得正确的xpath:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="Businessman[child]" priority="9">
<xsl:element name="Businessman">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="Businessman" priority="0" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>