空XML拆分默认XML

时间:2010-08-06 03:02:14

标签: xml xslt

我有一个传递给XSL的XML,它提供标准输出。根据某些情况,我有可能在某些时候将XML视为空。有没有办法,如果我们有空X​​ML并获得标准或默认输出XSL?

4 个答案:

答案 0 :(得分:3)

  

如果我们有空X​​ML,有什么办法吗?   并获得标准或默认   放入XSL?

您永远不会拥有“空XML”。

根据定义,格式良好的XML文档必须具有顶部元素。如果在任何非格式良好的XML文档上应用XSLT 1.0转换,则任何兼容的XSLT 1.0处理器都必须产生错误,并且不进行任何处理。

答案 1 :(得分:0)

来自http://www.w3.org/TR/xpath-functions/#func-doc-available

  

如果fn:doc($ uri)返回一个文档   node,此函数返回true。如果   $ uri不是有效的xs:anyURI,an   错误被提出[错误:FODC0005]。   否则,此函数返回   假的。

来自http://www.w3.org/TR/xpath-functions/#func-doc

  

一种可能的处理模型   功能如下。资源   由URI Reference标识的是   检索。如果资源不能   检索,出现错误   [ERR:FODC0002]。得到的数据   然后从检索动作   解析为XML文档和树   是按照建造的   [XQuery 1.0和XPath 2.0数据模型]。   如果已知顶级媒体类型   并且是“文本”,内容被解析   以与媒体类型相同的方式   是text / xml;否则,它被解析   以与媒体类型相同的方式   是application / xml。如果是内容   无法成功解析,一个   引发错误[错误:FODC0002]。   否则,该功能的结果   是根的文档节点   结果树。那么这棵树   可选择根据模式进行验证。

所以,看起来你可以做到这一点(由于“一种可能的处理模式”),我很谨慎: 这个样式表:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="pURI" select="'B.xml'"/>
    <xsl:template match="/">
        <DefaultResult>
            <xsl:if test="doc-available($pURI)">
                <xsl:apply-templates select="doc($pURI)/*"/>
            </xsl:if>
        </DefaultResult>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

任何输入和B.xml都是空文档,Saxon输出:

<DefaultResult/>

这个替代信息:

Error on line 1 column 1 of B.xml:
  SXXP0003: Error reported by XML parser: Premature end of file.

Altova输出:

<DefaultResult>
    <Entry type="Folder">
        <Name/>
        <Date/>
        <Info>
            <URI>B.xml</URI>
            <Comment/>
            <Files>0</Files>
            <CompressedSize>0</CompressedSize>
            <UncompressedSize>0</UncompressedSize>
            <Ratio>0</Ratio>
            <ContainsEncryptedFiles>false</ContainsEncryptedFiles>
        </Info>
    </Entry>
</DefaultResult>

答案 2 :(得分:-1)

一种方法是检查XSL中是否存在根节点,如果没有打印出来的话。

但是当我在Perl中尝试使用tsimiliar thin时,脚本挂了。所以我认为你必须检查大小然后应用XSL

答案 3 :(得分:-1)

如果您的根标签是空节点集,那么应该像这样工作......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:choose> 
      <xsl:when test='*[not(*)]'> 
        Empty
      </xsl:when> 
      <xsl:otherwise> 
        Full 
      </xsl:otherwise> 
    </xsl:choose> 
  </xsl:template> 
</xsl:stylesheet>

...如果文件为空(或者至少不包含根元素),则XSLT处理器很可能会抛出异常。