0

我正在一个我没有构建的应用程序内部工作。

应用程序需要True/False来自 XSLT 文件的排序,如果 XSLT 返回任何内容,则为真,如果不返回任何内容,则为假。应用程序使用它来决定是否将 XML 发布到 Web 服务。

所以我首先开始

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:choose>
   <xsl:when test="{{if this is true I don't want anything returned}}">

   </xsl:when>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

{我认为这可以解决问题,但我错了它仍在返回。如果我在它不存在时尝试,应用程序仍然会发布我不希望它发布的 XML。}

所以我尝试了

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:choose>
   <xsl:when test="{{if this is true I don't want anything returned}}">
    <xsl:message terminate="yes" />
   </xsl:when>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

它终止了转换,向应用程序发送了一个错误,该错误被应用程序捕获,并阻止了下一个 XML 通过发布过程。

我需要的是阻止 XSLT 文件在命令上返回结果。

也许我不完全理解 XSLT 的功能,我做错了什么。

4

2 回答 2

2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" />    

 <xsl:template match="/">
  <xsl:choose>
   <xsl:when test="{{if this is true I don't want anything returned}}" />
   <xsl:otherwise>
    <xsl:text>Return something</xsl:text>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

如果测试评估为真,这应该完全没有返回任何内容。

另一种变体是使用匹配表达式特异性:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" />    

 <!-- empty template with a more specific match expression -->
 <xsl:template match="/*[{if this is true I don't want anything returned}]" />

 <xsl:template match="/">
  <xsl:text>Return something</xsl:text>
 </xsl:template>
</xsl:stylesheet>

但是,在这种方法中,您只能在匹配表达式中测试输入文档中的节点。变量在匹配表达式中不起作用。

于 2013-07-02T19:45:07.620 回答
2

XSLT 样式表的输出始终是符合 XPath 数据模型的 XML 文档。这并不一定意味着它是格式良好的 XML。例如,它可以是没有子节点的文档节点(空文档)。这可能是您最接近输出“无”的方式。您测试此“无”的方式将取决于您的调用应用程序。在实践中,我建议输出一个易于应用程序测试的“东西”;例如包含单个空元素的文档<nothing/>

于 2013-07-02T21:50:14.980 回答