【问题标题】:best/most efficient way to test XSLT测试 XSLT 的最佳/最有效方法
【发布时间】:2011-10-23 15:24:27
【问题描述】:

我正在处理需要由 XSL 解析并输出 XML 的大而复杂的字典数据 (XML)。

测试 XSL 是否处理来自 XML(输入)的所有节点的“最佳”方法是什么?

请考虑这个简单的例子,我认为它代表了问题的本质:

输入.xml

<?xml version="1.0" encoding="UTF-8"?>
<a>
   <b>
      <c>
         some1
         <d>text2</d>
         more text1
      </c>
   </b>
   <b>
      <c>
         some2
         <d>text2</d>
         more text2
      </c>
   </b>
   <d>text3</d>
   <e>
      text
      <d>4</d>
   </e>
</a>

一些tarnsformations.xsl

输出.xml

<?xml version="1.0" encoding="UTF-8"?>
<amodified>
   <bmodified>
      some1
      <dd>text2</dd>
      more text1
   </bmodified>
   <bmodified>
      some2
      <dd>text2</dd>
      more text2
   </bmodified>
   <dd>text3</dd>
   <ed>text</ed>
   <dd>4</dd>
</amodified>

在 output.xml 中,标签的名称以及内容的顺序已更改(与输入文件相比)。 我需要比较输入中的所有文本字段是否在输出中可用。 我认为最好的解决方案是创建测试,它将从每个标签中提取文本并逐个字符串进行比较,将 output.xml 中不存在的标签输出到日志文件...?

【问题讨论】:

  • 没有一个例子的问题是没有建设性的。什么是“最佳”,什么是“处理所有节点”?我的猜测是仅仅处理所有节点并不是测试应该验证的。 “产生正确的结果”怎么样?正如所问的,这个问题与 XSLT 和测试几乎没有关系。请编辑和改进。

标签: xml xslt


【解决方案1】:

我会推荐两种测试:首先是对较小的受控数据集进行单元测试,该数据集应该是您在大型字典中找到的数据的模型。这可以被视为您的 xslt 进程的单元测试。我通常会从较大的数据集中提取几个有代表性的部分,并将它们与测试代码一起存储。然后测试将转换应用于测试数据并对结果进行断言,验证转换是否成功。

然后,您还应该在生产系统中构建健全性检查,以便(例如)确保处理的节点总数符合您的预期。例如,在具有大量条目的字典中,您可以运行一个步骤来计算所有条目,然后再运行一个步骤来处理它们。然后在最后,查看您处理了多少条目,并确保计数与您的预期相同。这也很有用,因为它提供了一种输出进度条(完成百分比)的方法。

无论如何,这就是我们所做的。

如果输出中的文本与输入中的文本相同,如您的示例 Marcin,您可以使用 xslt 相当轻松地比较它们。如果您处理带有空 xslt 样式表(仅 &lt;xslt:stylesheet /&gt; 节点)的 xml 文件,那么您将仅返回文本,没有标记。我认为 xmllint 也可以做到这一点。因此,只需在输入和输出上运行它,并使用简单的文本比较(如 diff)进行比较。

【讨论】:

  • @_Mike:通常在处理的节点和节点输出之间没有 1:1 的映射。一个通用的解决方案是在处理节点时提供调试输出,以便可以在最终输出中计算“已处理指标”。
  • @Dmitri - 这是真的;但在许多情况下,您可能能够计算预期输出节点的数量并进行比较。
  • @_Mike:是的,但问题不是如何验证输出节点的数量。问题是:如何验证每个输入节点都已被处理
  • @Dmitri 是的,我明白了。您答案中的方法是产生一些特殊的输出,保证每个输入节点产生一个输出节点。我建议使用预期输出的一些独立计算的属性来确保实际输出与预期一致,例如计算输出节点的数量 - 通常这可能是正确处理所有输入的函数。诚然,情况并非普遍如此,但尤其是在基本上由条目列表组成的字典中,这可能是一个好方法?
  • @_Mike:回答你的问题:即使输入是字典,如果任务不需要为某些条目生成相应的输出,取决于定义的条件,那么只需检查输出我们无法确定字典的每个节点是否都已处理。
【解决方案2】:

可以使用这种技术

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output method="text"/>

 <xsl:template match="/*">
     <xsl:variable name="vrtfResults">
       <xsl:apply-templates select="num"/>
     </xsl:variable>

     <xsl:variable name="vProcessed" select=
     "count(ext:node-set($vrtfResults)/nodeProcessed)"/>

     <xsl:variable name="vAll" select="count(num)"/>

     <xsl:text>From the existing </xsl:text>
     <xsl:value-of select="$vAll"/>
     <xsl:text> &lt;num> elements </xsl:text>
     <xsl:value-of select="$vProcessed"/>
     <xsl:text> were processed.</xsl:text>
 </xsl:template>

 <xsl:template match="num">
  <nodeProcessed/>
  <num><xsl:value-of select="2*."/></num>
 </xsl:template>
</xsl:stylesheet>

应用于以下 XML 文档时

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

产生想要的结果

From the existing 10 <num> elements 10 were processed.

解释

  1. 一个特殊的仅测试元素 (&lt;nodeProcessed/&gt;) 已添加到每个 &lt;num&gt; 元素的处理中。

  2. 我们将输出捕获到一个变量中,然后计算&lt;nodeProcessed/&gt; 元素的数量,并将它们与必须处理的&lt;num&gt; 元素的总数进行比较。

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 2015-10-01
    • 1970-01-01
    • 2011-03-09
    • 2019-08-06
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多