【问题标题】:xslt - create empty file using xslt 1.0xslt - 使用 xslt 1.0 创建空文件
【发布时间】:2017-09-22 19:01:06
【问题描述】:

我正在尝试通过 xslt 创建一个空文件。

输入样本是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Businessman>
    <siblings>
        <sibling>John </sibling>
    </siblings>
    <child> Pete </child>
    <child> Ken </child>
</Businessman>

当输入包含任何“子”标签时,它应该按原样生成文件。当输入没有任何“子”标签时,我需要创建一个空文件(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'标签时没有产生任何空文件。

我需要测试的文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Businessman>
    <siblings>
        <sibling>John </sibling>
    </siblings>
</Businessman>

任何帮助都会很棒!

谢谢

【问题讨论】:

    标签: xslt-1.0


    【解决方案1】:

    如果你想让处理器不厌其烦地打开输出文件,你必须给它一些东西来写入输出文件。尝试一个空的文本节点。你只需要做出“复制与否”的决定吗?一次。

    如果不满足条件,只需做出一次决定并产生空输出的一种方法是将模板替换为:

    <xsl:template match="/">
      <xsl:choose>
        <xsl:when test="/Businessman/child">
          <xsl:copy-of select="*"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    

    这在 xsltproc 中可以正常工作。 (如果您发现自己得到了一个包含 XML 声明的文件而没有其他内容,请尝试调整 xsl:output 上的参数。)

    但是当我发现自己遇到类似情况时(如果条件 C 成立,则执行此转换,否则...),我只是为文档节点添加了一个模板,对于您的情况看起来像这样:

    <xsl:choose>
      <xsl:when test="/Businessman/child">
        <xsl:apply-templates/>
      </
      <xsl:otherwise>
        <xsl:message terminate="yes">No children in this input, dying ...</
      </
    </
    

    这样我根本没有输出,而不是零长度输出。

    【讨论】:

    • 如何调整xsl:output?我尝试了一些东西 - 但我不断收到 "
    • omit-xml-declaration设置为yes
    【解决方案2】:

    足够简单 - 只是不要试图在一个模板中做所有事情,不要忘记省略 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2019-08-06
      • 2014-12-09
      相关资源
      最近更新 更多