我正在尝试将一个非常混乱的xml的一部分转换为更具可读性的部分,但是当我的代码没有生成我想要的内容时。
我可以获得一些关于我的代码有什么问题的反馈,以及我如何解决它?
示例输入:
<root>
<body>
<para>
<heading> name </heading>
</para>
<para> This is the name </para>
<para>
<heading> Usage </heading>
</para>
<para> This is the usage </para>
</body>
<root>
我想看到的输出是:
<root>
<conbody>
<section>
<title> Name </title>
<p> This is the name </p>
</section>
<section>
<title> Usage </title>
<p> This is the usage </p>
<conbody>
<root>
我的代码目前看起来像这样:
<xsl:template match="body">
<conbody>
<xsl:for-each-group select="para" group-starting-with="para[heading]">
<section>
<title>
<xsl:apply-templates select="element()"/>
</title>
<p>
<xsl:apply-templates select="*"/>
</p>
</section>
</xsl:for-each-group>
</conbody>
</xsl:template>
内容未正确复制,我不确定原因?
答案 0 :(得分:2)
这是因为您需要将模板应用于current-group()
。
您可以尝试在第一个current-group()[1]
中使用xsl:apply-templates
,在第二个current-group()[not(position()=1)]
中使用xsl:apply-templates
;这应该让你接近。
以下是创建title
和p
元素的略有不同方法的示例...
XML输入
<root>
<body>
<para>
<heading> name </heading>
</para>
<para> This is the name </para>
<para>
<heading> Usage </heading>
</para>
<para> This is the usage </para>
</body>
</root>
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<conbody>
<xsl:for-each-group select="para" group-starting-with="para[heading]">
<section>
<xsl:apply-templates select="current-group()"/>
</section>
</xsl:for-each-group>
</conbody>
</xsl:template>
<xsl:template match="para">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="para/text()">
<p><xsl:value-of select="."/></p>
</xsl:template>
<xsl:template match="heading">
<title><xsl:apply-templates/></title>
</xsl:template>
</xsl:stylesheet>
XML输出
<root>
<conbody>
<section>
<title> name </title>
<p> This is the name </p>
</section>
<section>
<title> Usage </title>
<p> This is the usage </p>
</section>
</conbody>
</root>