Xml 测试XSLT的最佳/最有效方法
我正在处理大而复杂的字典数据(XML),它需要通过XSL解析并输出XML 如果XSL正在处理来自XML(输入)的所有节点,那么什么是测试的“最佳”方法 请考虑这个简单的例子,我想这将代表问题的本质: input.xmlXml 测试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 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> <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> <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> <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> <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> <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> <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)进行比较。没有一个示例的问题是没有建设性的。什么是“最佳”以及什么是“处理所有节点”?我的猜测是,仅仅处理所有节点并不是测试应该验证的。“生成正确的结果”怎么样