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

Xml 测试XSLT的最佳/最有效方法,xml,xslt,Xml,Xslt,我正在处理大而复杂的字典数据(XML),它需要通过XSL解析并输出XML 如果XSL正在处理来自XML(输入)的所有节点,那么什么是测试的“最佳”方法 请考虑这个简单的例子,我想这将代表问题的本质: input.xml <?xml version="1.0" encoding="UTF-8"?> <a> <b> <c> some1 <d>text2</d>

我正在处理大而复杂的字典数据(XML),它需要通过XSL解析并输出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>

某物
文本2
更多文本1
大约2
文本2
更多文本2
文本3
文本
4.
一些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>

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

一个人可以使用这种技巧:

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

从现有的
num>元素
已处理。
应用于以下XML文档时

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

01
02
03
04
05
06
07
08
09
10
产生所需结果

<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>
<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.
从现有的10个元素中处理10个元素。
说明

  • 在每个
    元素的处理中添加了一个特殊的纯测试元素(

  • 我们将输出捕获到一个变量中,然后计算
    元素的数量,并将其与必须处理的
    元素总数进行比较


  • 一个人可以使用这项技术

    <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>
    
    <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.
    
    
    从现有的
    num>元素
    已处理。
    
    应用于以下XML文档时

    <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>
    
    <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.
    
    
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    
    产生所需结果

    <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>
    
    <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.
    
    从现有的10个元素中处理10个元素。
    
    说明

  • 在每个
    元素的处理中添加了一个特殊的纯测试元素(

  • 我们将输出捕获到一个变量中,然后计算
    元素的数量,并将其与必须处理的
    元素总数进行比较


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

    然后,您还应该在生产系统中构建健全性检查,以便(例如)确保处理的节点总数与您期望的一致。例如,在包含大量条目的词典中,可以运行一个步骤来统计所有条目,然后运行另一个步骤来处理它们。然后在最后,查看您处理了多少条记录,并确保计数与您预期的相同。这也很有用,因为它提供了一种输出进度条(%complete)的方法

    不管怎样,我们就是这么做的


    如果输出中的文本与输入中的文本相同(如您的示例Marcin),则可以使用xslt非常轻松地比较这些文本。如果处理一个带有空xslt样式表的xml文件(只有
    节点),则只返回文本,不带标记。我认为xmllint也可以做到这一点。因此,只需在输入和输出上运行该测试,并使用简单的文本比较(如diff)进行比较。

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

    然后,您还应该在生产系统中构建健全性检查,以便(例如)确保处理的节点总数与您期望的一致。例如,在包含大量条目的词典中,可以运行一个步骤来统计所有条目,然后运行另一个步骤来处理它们。然后在最后,查看您处理了多少条记录,并确保计数与您预期的相同。这也很有用,因为它提供了一种输出进度条(%complete)的方法

    不管怎样,我们就是这么做的


    如果输出中的文本与输入中的文本相同(如您的示例Marcin),则可以使用xslt非常轻松地比较这些文本。如果处理一个带有空xslt样式表的xml文件(只有
    节点),则只返回文本,不带标记。我认为xmllint也可以做到这一点。因此,只需在输入和输出上运行它,并使用简单的文本比较(如diff)进行比较。

    没有一个示例的问题是没有建设性的。什么是“最佳”以及什么是“处理所有节点”?我的猜测是,仅仅处理所有节点并不是测试应该验证的。“生成正确的结果”怎么样