XSLT以特定模式添加标签
问题描述:
我在下一次模式匹配之前添加“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>
答
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>
如果'P'元素具有比'1级之外的子元素会发生什么',例如你想要什么改造'
酒吧 ... ... ... 酒吧 ... ...
'来? –如果P有孩子,那么我想对它们进行转换,因为它在P. – user23
检查我发布的答案是否有帮助,如果不是,您需要澄清'P'的'Level1'子元素的同胞元素会发生什么情况元素。 –