我有以下Xml文件(例如,不是真实文件):
<TestCases>
<TestCase>
<Name>TC1</Name>
<TestCaseElement>
<Code>
<Line>InstA=Value1</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstB=Value2</Line>
<Line>InstC=Value1</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstA=Value3</Line>
<Line>InstC=Value1</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstD=Value2</Line>
<Line>InstB=Value1</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstA=Value4</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstC=Value5</Line>
<Line>InstE=Value6</Line>
</Code>
</TestCaseElement>
</TestCase>
<TestCase>
<Name>TC2</Name>
<TestCaseElement>
<Code>
<Line>InstC=Value8</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstD=Value7</Line>
<Line>InstB=Value3</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstC=Value5</Line>
<Line>InstA=Value6</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstD=Value2</Line>
<Line>InstB=Value1</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstA=Value4</Line>
</Code>
</TestCaseElement>
<TestCaseElement>
<Code>
<Line>InstA=Value5</Line>
<Line>InstB=Value6</Line>
</Code>
</TestCaseElement>
</TestCase>
</TestCases>
我想要的是为每个唯一的InstX字符串应用一个模板(忽略'='之后的内容。我一直在使用:
<xsl:apply-templates select="TestCases/TestCase/TestCaseElement[Code]/Code/Line[not(substring-before(.,'==')=substring-before(preceding::Code/Line,'=='))]"/>
但这不起作用。
最后作为输出我需要类似的东西:
<Values>
<Value>InstA</Value>
<Value>InstB</Value>
<Value>InstC</Value>
<Value>InstD</Value>
<Value>InstE</Value>
<Values>
重要的是我无法使用任何扩展功能。只是简单的Xslt 2.0
答案 0 :(得分:1)
如果您使用的是XSLT 2.0,则此处不需要扩展功能。
您可以使用xsl:for-each-group
...
<xsl:for-each-group select="TestCases/TestCase/TestCaseElement[Code]/Code/Line" group-by="substring-before(.,'=')">
<Value>
<xsl:value-of select="current-grouping-key()" />
</Value>
</xsl:for-each-group>
或者您可以使用distinct-values
功能...
<xsl:for-each select="distinct-values(TestCases/TestCase/TestCaseElement[Code]/Code/Line/substring-before(.,'='))">
<Value>
<xsl:value-of select="." />
</Value>
</xsl:for-each>