测试XSLT的最佳/最有效方法

时间:2011-10-23 15:24:28

标签: xml xslt

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

如果XSL正在处理来自XML(输入)的所有节点,那么将被视为“最佳”测试方式?

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

input.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>

some tarnsformations.xsl

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果输出中的文本与输入中的文本相同,如您的示例Marcin,您可以使用xslt相当容易地比较它们。如果您使用空的xslt样式表(只是<xslt:stylesheet />节点)处理xml文件,那么您将只返回文本,没有标记。我认为xmllint也可以做到这一点。因此,只需在输入和输出上运行,然后使用简单的文本比较(如差异)进行比较。

答案 1 :(得分:1)

可以使用此技术

<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. 在每个<nodeProcessed/>元素的处理中添加了一个特殊的仅测试元素(<num>)。

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

    < / LI>