XSLT:generate-id()和2个相等的参数

时间:2012-08-30 11:42:35

标签: xslt xslt-2.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中看到两个identic ModelingToolID。
我在转换中和我想要的输出中都需要TestCaseElements 但是,可以理解的是,只会采取第一个。
我能做些什么来获得两个TestCaseElement?

1 个答案:

答案 0 :(得分:1)

  

你在Linenumber 8370和10296中看到两个相同的ModelingToolID。   我需要在转换中和我想要的两个TestCaseElements   输出。但是,可以理解的是,只会采取第一个。什么可以   我想得到两个TestCaseElement?

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

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

key( 'ModelingToolID', .)

这将选择所有节点,这些节点与名为match的{​​{1}} xsl:key属性中的匹配模式匹配 - 正是您想要获取的。< / p>

您可以在各种XSLT说明中使用此表达式

"ModelingToolID"

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

或者你需要做什么。