我(不幸地)必须使用的软件会生成一个包含多个数据集的 XML 文件(参见以下示例:“文档 1”、“文档 2”……),但没有用包装<document>
标签将它们分开。它看起来像这样:
<print>
<section>
<col1>*****</col1>
<col2>Document 1</col2>
</section>
<section>
<col1>Title</col1>
<col2>Title 1</col2>
</section>
<section>
<col1>Year</col1>
<col2>2011</col2>
</section>
<section />
<section>
<col1>*****</col1>
<col2>Document 2</col2>
</section>
<section>
<col1>Title</col1>
<col2>Title 2</col2>
</section>
<section>
<col1>Year</col1>
<col2>2012</col2>
</section>
<section />
<section>
<col1>*****</col1>
<col2>Document 3</col2>
</section>
<section>
<col1>Title</col1>
<col2>Title 3</col2>
</section>
<section>
<col1>Year</col1>
<col2>2013</col2>
</section>
<section />
...
</print>
正如你所看到的,每个新的“文档”都从<col1>*****</col1>
它的第一个<section></section>
标签开始,并以一个空标签结束(或者更具体地说:后跟)<section />
。
我想要做的是取出每个<col2>
值并将其放入包装标签中,所以最后我应该得到文档的分离数据集。结果应如下所示:
<print>
<document>
<docno>Document 1</docno>
<title>Title 1</title>
<year>2011</year>
</document>
<document>
<docno>Document 2</docno>
<title>Title 2</title>
<year>2012</year>
</document>
<document>
<docno>Document 3</docno>
<title>Title 3</title>
<year>2013</year>
</document>
</print>
所以我必须获取所有<col2>
值,将它们放入新元素并将它们包装在<document>
标签中。我使用以下 XSLT 进行了尝试,并且取得了部分成功(我可以获取<col2>
值),但是在<xsl:when>
标签内(我尝试包装<col2>
值)会引发错误,因为<document>
标签没有立即关闭:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template name="content">
<xsl:if test="col1='*****'">
<xsl:element name="docno">
<xsl:value-of select="col2"/>
</xsl:element>
</xsl:if>
<xsl:if test="col1='Title'">
<xsl:element name="title">
<xsl:value-of select="col2"/>
</xsl:element>
</xsl:if>
<xsl:if test="col1='Year'">
<xsl:element name="year">
<xsl:value-of select="col2"/>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template match="/">
<xsl:element name="print">
<xsl:for-each select="print/section">
<xsl:choose>
<xsl:when test="col1='*****'">
<xsl:element name="document">
</xsl:when>
<xsl:when test="not(col1/node())">
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="content"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我发现在 XSLT 中,有条件地打开和关闭标签是不可能的,但我确信还有另一种解决方案可以实现我的目标......我只是没有经验找到它。有人能指出我正确的方向吗?非常感谢您!