我有一个传递给XSL的XML,它提供标准输出。根据某些情况,我有可能在某些时候将XML视为空。有没有办法,如果我们有空XML并获得标准或默认输出XSL?
答案 0 :(得分:3)
如果我们有空XML,有什么办法吗? 并获得标准或默认 放入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处理器很可能会抛出异常。