为什么XSLT输出的所有文字默认?为什么XSLT输出的所有文字默认?(Why does XSLT o

2019-05-10 23:23发布

您好我已经履行其下降标签,如果它是空的转换。

我想检查我的转型是否工作正常,所以不是手动检查它,我写了一个详细的XSLT代码,只检查特定标签的输出XML的存在,如果它为null,则第二XSLT应输出文本“发现”。 (其实我并不需要一些XML输出的类型,但我只是用XSLT进行搜索。)

当我试图用这个XSL代码::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
</xsl:stylesheet>

它输出的所有文本数据是出现在XML文件中,

要避免这种情况,我不得不写这个代码::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']">
      FOUND
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

为什么以前的代码文本输出,我为什么要坚持XSL忽略所有其他文本? 是,还是只有我自己的所有的XML解析器的行为(我使用MSXML解析器)。

Answer 1:

为什么以前的代码文本输出,我为什么要坚持XSL忽略所有其他文本? 是所有的XML解析器或只是我自己的行为

要发现的如说明书中规定的最根本的XSLT的功能之一:在XSLT的内置模板

从该规格

有一个内置的模板规则允许递归处理通过在样式表中显式模板规则在没有成功的模式匹配的继续。 此模板规则适用于元素节点和根节点。 下图显示了内置的模板规则相当于:

 <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> 

还有各种模式,它允许递归处理通过在样式表中显式模板规则在没有一个成功的模式匹配的同样方式继续内置模板规则。 此模板规则适用于元素节点和根节点。 以下是模式m内置模板规则是等价的。

 <xsl:template match="*|/" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template> 

还有用于文本内置模板规则,并通过属性节点那份文本:

 <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> 

用于处理指令内置模板规则和意见是什么也不做。

 <xsl:template match="processing-instruction()|comment()"/> 

命名空间节点的内置模板规则也是无可奈何。 没有图案可以匹配一个命名空间节点; 因此,内置的模板规则是应用于命名空间节点的唯一模板规则。

内置模板规则被视为好像它们是样式表之前隐含的进口,因此具有比其它模板规则下导入优先级。 因此,笔者可以通过包括一个明确的模板规则覆盖内置的模板规则。

因此,报告的行为的内置模板应用的结果 - 他们三个人的第一和第二。

这是一个很好的XSLT设计模式来超越自己的内置模板 ,以便程序员立即知道他的转化是“泄露”将颁发每当称为一个错误信息:

例如 ,如果有这样的XML文档:

<a>
  <b>
    <c>Don't want to see this</c>
  </b>
</a>

并对其进行处理与这一转变

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

 <xsl:template match="a|b">
   <xsl:copy>
      <xsl:attribute name="name">
        <xsl:value-of select="name()"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

其结果是

<a name="a">
   <b name="b">Don't want to see this</b>
</a>

和程序员将大大迷惑了不需要的文本如何出现。

然而,仅仅增加这个catch-all template有助于避免任何这样的困惑,并立即发现错误

 <xsl:template match="*">
  <xsl:message terminate="no">
   WARNING: Unmatched element: <xsl:value-of select="name()"/>
  </xsl:message>

  <xsl:apply-templates/>
 </xsl:template>

现在,除了混乱的输出程序员获取立即解释该问题的警告

 WARNING: Unmatched element: c

后来加入由迈克尔·凯的XSLT 3.0

在XSLT 3.0,而不是添加一个包罗万象的模板规则,您可以指定上回退行为xsl:mode声明。 例如, <xsl:mode on-no-match="shallow-skip"/>要跳过导致该不匹配(包括文本节点)中的所有节点,而<xsl:mode on-no-match="fail"/>把一个不匹配为错误,和<xsl:mode warning-on-no-match="true"/>在一个警告结果。



Answer 2:

有几个内置的模板规则的XSL,其中之一是这样的:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

它输出的文本。



文章来源: Why does XSLT output all text by default?
标签: xslt