0

使用 XSLT 2.0:

@ Linenumber 8370 这个代码:

<TestCaseElement>
            <Name><![CDATA[DUT_AC_ON]]></Name>
            <TaggedValues>
            </TaggedValues>
            <Description>
                <Line><![CDATA[{TEXT_LANG} DUT AC ON]]></Line>
                <Line><![CDATA[{TEXT_ENGL} DUT AC ON]]></Line>
            </Description>
            <ModelingToolID><![CDATA[EAID_E9ACC0C9_D383_4ef0_99FF_F87C90BDF43C]]></ModelingToolID>
            <Hash><![CDATA[1238228468]]></Hash>
            <ID><![CDATA[1115]]></ID>
            <Stereotypes>
                <Stereotype><![CDATA[StepStart]]></Stereotype>
            </Stereotypes>
            <Role><![CDATA[TESTSTEP]]></Role>

</TestCaseElement>

稍后在 XML-Document 中使用相同的ModelingToolID

这是图片的外部链接以进行可视化:http: //i.imgur.com/vTmki.png

我用这个 XSL 代码生成 ID:

<xsl:for-each select="/TestCases/TestCase/TestCaseElement/ModelingToolID[  
 ( not( ../Stereotypes ) or ( ../Stereotypes/Stereotype != 'Precondition' and
  ../Stereotypes/Stereotype != 'Postcondition' ) ) and 
 (../Stereotypes/Stereotype = 'StepStart') and 
 ( ../Role = 'TESTSTEP' or ../Role = 'VP' )  and 
 ../Description and 
 ( generate-id() = generate-id( key( 'ModelingToolID', .)[ 1 ] ) ) ]">

您可以在 Linenumber 8370 和 10296 中看到两个相同的 ModelingToolID。
我的转换和所需的输出中都需要 TestCaseElements。
但是,可以理解的是,只会采取第一个。
我该怎么做才能同时获得两个 TestCaseElement?

4

1 回答 1

1

您在 Linenumber 8370 和 10296 中看到两个相同ModelingToolID的。我的转换和所需的输出中都需要 TestCaseElements。但是,可以理解的是,只会采取第一个。我该怎么做才能同时获得两个 TestCaseElement?

根据定义,该函数key()(没有附加谓词)产生一个节点集,每个节点都具有与第二个参数相同的键。

因此,在xsl:for-each您需要的指令中:

key( 'ModelingToolID', .)

这将选择与命名属性中的匹配模式匹配的所有节点——正是您想要获得的。matchxsl:key"ModelingToolID"

您可以在各种 XSLT 指令中使用此表达式

<xsl:variable name="vGroup" select="key( 'ModelingToolID', .)"/>

或者

<xsl:for-each select="key( 'ModelingToolID', .)">
  <!-- Process the group here  -->
</xsl:for-each>

或者你需要做的任何事情。

于 2012-08-30T12:04:25.970 回答