2017-06-03 65 views
0

我在下一次模式匹配之前添加“P”标签时遇到问题。XSLT以特定模式添加标签

源我得到的是:

<root> 
<Element> 
    <P>Value1</P> 
    <P> 
     <Level1> 
      <Level2 type="i">Name1</Level2>, Title1 
     </Level1>, Text1 
     <Level1> 
      <Level2 type="i">Name2</Level2> 
     </Level1>, Text2.</P> 
    <P> 
     <Level1> 
      <Level2 type="i">Name3</Level2>, Title2 
     </Level1>, Text3. 
    </P> 
</Element> 

希望出我要的是

<root> 
<Element> 
    <P>Value1</P> 
    <P> 
     <Level1> 
      <Level2 type="i">Name1</Level2>, Title1 
     </Level1>, Text1 
    </P> 
    <P> 
     <Level1> 
      <Level2 type="i">Name2</Level2> 
     </Level1>, Text2.</P> 
    <P> 
     <Level1> 
      <Level2 type="i">Name3</Level2>, Title2 
     </Level1>, Text3. 
    </P> 
</Element> 
</root> 

下面的模板不给我想要的结果,请大家帮

<xsl:template match="Element"> 
    <xsl:copy> 
     <xsl:for-each-group select="P" group-starting-with="Level1/Level2"> 
       <P> 
        <xsl:sequence select="current-group()"/> 
       </P> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 
+0

如果'P'元素具有比'1级之外的子元素会发生什么',例如你想要什么改造'

酒吧 ... ... ... 酒吧 ... ...

'来? –

+0

如果P有孩子,那么我想对它们进行转换,因为它在P. – user23

+0

检查我发布的答案是否有帮助,如果不是,您需要澄清'P'的'Level1'子元素的同胞元素会发生什么情况元素。 –

回答

0

I认为你需要匹配P模板使用for-each-group,然后你会得到

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="P"> 
     <xsl:for-each-group select="node()" group-starting-with="Level1[Level2]"> 
       <P> 
        <xsl:apply-templates select="current-group()"/> 
       </P> 
     </xsl:for-each-group> 
    </xsl:template> 

</xsl:transform> 

其在http://xsltransform.net/gVhD8QT给出结果

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Element> 
     <P>Value1</P> 
     <P> 
     <Level1> 
      <Level2 type="i">Name1</Level2>, Title1 
     </Level1>, Text1 
     </P> 
     <P> 
     <Level1> 
      <Level2 type="i">Name2</Level2> 
     </Level1>, Text2.</P> 
     <P> 
     <Level1> 
      <Level2 type="i">Name3</Level2>, Title2 
     </Level1>, Text3. 
    </P> 
    </Element> 
</root>