xslt - 使用xslt 1.0创建空文件

时间:2017-09-22 19:01:07

标签: xslt-1.0

我正在尝试通过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>

任何帮助都会很棒!

由于

2 个答案:

答案 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>