Testing 使用<;x:expect test="&引用/&燃气轮机;在Xspec中

Testing 使用<;x:expect test="&引用/&燃气轮机;在Xspec中,testing,xslt,xspec,Testing,Xslt,Xspec,请帮助我学习xspec语法。 我想将测试文件中的值与常量进行比较: 测试文件: <?xml version='1.0' encoding='ISO-8859-5'?> <List> <M_INSDES> <S_UNH> <D_0062>3600</D_0062> <C_S009> <D_0065>I

请帮助我学习xspec语法。 我想将测试文件中的值与常量进行比较: 测试文件:

<?xml version='1.0' encoding='ISO-8859-5'?>
<List>
    <M_INSDES>
        <S_UNH>
            <D_0062>3600</D_0062>
            <C_S009>
                <D_0065>INSDES</D_0065>
                <D_0052>D</D_0052>
                <D_0054>96A</D_0054>
                <D_0051>UN</D_0051>
                <D_0057>EAN001</D_0057>
            </C_S009>
        </S_UNH>
    </M_INSDES>
</List>

3600
INSDES
D
96A
联合国
EAN001
以下场景按预期工作:

    <x:scenario label="Scenario for testing an EDIFACT document type">
        <x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009/D_0065">
        </x:context>        
        <x:expect label="The result of testing EDIFACT document type">INSDES</x:expect>                 
    </x:scenario>

INSDES

但具有多个值的场景失败:

<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
    <x:context href="test.xml" select="/List/M_INSDES/S_UNH/C_S009">
    </x:context>        
    <x:expect label="Message type identifier" test="D_0065 = 'INSDES'"></x:expect> 
    <x:expect label="Message type version number" test="D_0052 = 'D'"></x:expect>            
    <x:expect label="Message type release number" test="D_0054 = '96A'"></x:expect>                     
</x:scenario>

如何使用
检查节点C_S009的三个值

UPD.:添加了xsl样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:my="myfunctions"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <xsl:copy-of select="."/> 
    </xsl:template>
</xsl:stylesheet>

我认为您所做的一切都是正确的,但是您相对XPath的上下文是错误的。尝试在
expect
元素中使用绝对路径,如下所示,然后选择根元素:

<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
    <x:context href="testdata.xml" select="/">
    </x:context>        
    <x:expect label="Message type identifier" test="/List/M_INSDES/S_UNH/C_S009/D_0065 = 'INSDES'"></x:expect> 
    <x:expect label="Message type version number" test="/List/M_INSDES/S_UNH/C_S009/D_0052 = 'D'"></x:expect>            
    <x:expect label="Message type release number" test="/List/M_INSDES/S_UNH/C_S009/D_0054 = '96A'"></x:expect>                     
</x:scenario>

我认为相对路径不起作用,因为在匹配根元素时,样式表只是复制完整的文档。在包含错误的XSpec报告中,您可以看到带有相对路径的测试的结果只是元素的字符串值

在发布样式表之前,我使用了一个带有递归“复制所有节点”模板的样式表

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

使用此样式表,相对路径可以正常工作

<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
    <x:context href="testdata.xml" select="/List/M_INSDES/S_UNH/C_S009">
    </x:context>        
    <x:expect label="Message type identifier" test="C_S009/D_0065 = 'INSDES'"></x:expect> 
    <x:expect label="Message type version number" test="C_S009/D_0052 = 'D'"></x:expect>            
    <x:expect label="Message type release number" test="C_S009/D_0054 = '96A'"></x:expect>                     
</x:scenario>

我认为您所做的一切都是正确的,但是您相对XPath的上下文是错误的。尝试在
expect
元素中使用绝对路径,如下所示,然后选择根元素:

<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
    <x:context href="testdata.xml" select="/">
    </x:context>        
    <x:expect label="Message type identifier" test="/List/M_INSDES/S_UNH/C_S009/D_0065 = 'INSDES'"></x:expect> 
    <x:expect label="Message type version number" test="/List/M_INSDES/S_UNH/C_S009/D_0052 = 'D'"></x:expect>            
    <x:expect label="Message type release number" test="/List/M_INSDES/S_UNH/C_S009/D_0054 = '96A'"></x:expect>                     
</x:scenario>

我认为相对路径不起作用,因为在匹配根元素时,样式表只是复制完整的文档。在包含错误的XSpec报告中,您可以看到带有相对路径的测试的结果只是元素的字符串值

在发布样式表之前,我使用了一个带有递归“复制所有节点”模板的样式表

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

使用此样式表,相对路径可以正常工作

<x:scenario label="Scenario for testing an EDIFACT document type for inbound file">
    <x:context href="testdata.xml" select="/List/M_INSDES/S_UNH/C_S009">
    </x:context>        
    <x:expect label="Message type identifier" test="C_S009/D_0065 = 'INSDES'"></x:expect> 
    <x:expect label="Message type version number" test="C_S009/D_0052 = 'D'"></x:expect>            
    <x:expect label="Message type release number" test="C_S009/D_0054 = '96A'"></x:expect>                     
</x:scenario>

您可以发布您正在使用XSpec测试进行测试的XSLT代码吗?如果没有XSLT,很难复制它


如果您正在测试一个原子值(即本例中的字符串),您可能会对使用
x:expect
元素的
select
属性感兴趣,如中所述。

您是否可以发布您正在使用XSpec测试的XSLT代码?如果没有XSLT,很难复制它


如果您正在测试一个原子值(即本例中的字符串),您可能会对使用
x:expect
元素的
select
属性感兴趣,如中所述。

我在问题中添加了一个xsl样式表。但我不明白xslt样式表在这种情况下是如何使用的,因为我直接测试href文件中的值C_S009/D_0065,而不进行转换。XSpec是XSL样式表的一种单元测试框架。如果不进行转换,为什么要使用XSpec?我在问题中添加了一个xsl样式表。但我不明白xslt样式表在这种情况下是如何使用的,因为我直接测试href文件中的值C_S009/D_0065,而不进行转换。XSpec是XSL样式表的一种单元测试框架。如果您不进行转换,为什么要使用XSpec?由于您在问题中发布的样式表,我更改了我的答案。您可以提供您的模板吗?谢谢,这对我有用!:-)我没有太注意样式表:-)只是好奇:您的样式表不会更改XML。当您不想测试样式表时,为什么要使用XSpec?XSpec是XSL样式表的单元测试框架。我想在转换之前使用XSpec验证“入站”XML文档中的值。由于您在问题中发布的样式表,我更改了我的答案。您可以提供您的模板吗?谢谢,这对我有用!:-)我没有太注意样式表:-)只是好奇:您的样式表不会更改XML。当您不想测试样式表时,为什么要使用XSpec?XSpec是XSL样式表的单元测试框架。我想在转换之前使用XSpec验证“入站”XML文档中的值。