xslt:使用substring-before和axes

时间:2018-03-20 15:51:42

标签: xslt

我有以下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

1 个答案:

答案 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>