我正在尝试根据其孙子节点的属性值向节点添加不同的标记。
样本输入(1x3表):
<table>
<row>
<cell row="1" column="1" >heading text one</cell>
</row>
<row>
<cell row="2" column="1" >body text one</cell>
</row>
<row>
<cell row="3" column="1" >body text two</cell>
</row>
</table>
需要这样的输出:
<TableElmt>
<HeadingElmt>
<RowElmt>
<CellElmt>heading text one</CellElmt>
</RowElmt>
</HeadingElmt>
<BodyElmt>
<RowElmt>
<CellElmt>body text one</CellElmt>
</RowElmt>
<RowElmt>
<CellElmt>body text two</CellElmt>
</RowElmt>
</BodyElmt>
</TableElmt>
基本上我只能根据单元格的@row元素来判断该行是否为标题行。
这是我尝试过的:
<xsl:template name="matcheverything" match="table">
<xsl:apply-templates select="row" />
</xsl:template>
<xsl:template name="matchheadings" match="table[*/*/@row=1]">
<BodyElmt>
<xsl:apply-templates select="row" />
</BodyElmt>
</xsl:template>
<xsl:template match="row">
<xsl:choose>
<xsl:when test="*/@row=1">
<HeadingElmt><RowElmt>
<xsl:apply-templates select="cell"/>
</RowElmt></HeadingElmt>
</xsl:when>
<xsl:otherwise>
<RowElmt>
<xsl:apply-templates select="cell"/>
</RowElmt>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="cell">
<CellElmt><xsl:apply-templates select="*"/></CellElmt>
</xsl:template>
我认为具有更具体匹配要求的“matchheadings”模板应该识别标题行,但它实际上匹配表中的每一行。
所以我从这个样式表中实际输出的每一行都被视为标题行 - 非常糟糕:(
<TableElmt>
<HeadingElmt>
<RowElmt>
<CellElmt>heading text one</CellElmt>
</RowElmt>
<RowElmt>
<CellElmt>body text one</CellElmt>
</RowElmt>
<RowElmt>
<CellElmt>body text two</CellElmt>
</RowElmt>
</HeadingElmt>
</TableElmt>
答案 0 :(得分:1)
修改:看起来我错过了这个
基本上我只能决定是否排 是基于@row的标题行 细胞的元素。
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="table">
<TableElmt>
<HeadingElmt>
<xsl:apply-templates select="row[cell/@row=1]"/>
</HeadingElmt>
<BodyElmt>
<xsl:apply-templates select="row[cell/@row!=1]"/>
</BodyElmt>
</TableElmt>
</xsl:template>
<xsl:template match="row">
<RowElmt>
<xsl:apply-templates/>
</RowElmt>
</xsl:template>
<xsl:template match="cell">
<CellElmt>
<xsl:apply-templates/>
</CellElmt>
</xsl:template>
</xsl:stylesheet>
输出:
<TableElmt>
<HeadingElmt>
<RowElmt>
<CellElmt>heading text one</CellElmt>
</RowElmt>
</HeadingElmt>
<BodyElmt>
<RowElmt>
<CellElmt>body text one</CellElmt>
</RowElmt>
<RowElmt>
<CellElmt>body text two</CellElmt>
</RowElmt>
</BodyElmt>
</TableElmt>
答案 1 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="table">
<TableElmt>
<xsl:apply-templates/>
</TableElmt>
</xsl:template>
<xsl:template match="row[cell/@row='1']">
<HeadingElmt>
<xsl:apply-templates select="." mode="copy"/>
</HeadingElmt>
</xsl:template>
<xsl:template match="row[cell[not(@row='1')]][1]">
<BodyElmt>
<xsl:apply-templates select=".|following-sibling::row" mode="copy"/>
</BodyElmt>
</xsl:template>
<xsl:template match="row" mode="copy">
<RowElmt>
<xsl:apply-templates/>
</RowElmt>
</xsl:template>
<xsl:template match="cell">
<CellElmt>
<xsl:value-of select="."/>
</CellElmt>
</xsl:template>
<xsl:template match="row"/>
</xsl:stylesheet>
应用于提供的XML文档:
<table>
<row>
<cell row="1" column="1" >heading text one</cell>
</row>
<row>
<cell row="2" column="1" >body text one</cell>
</row>
<row>
<cell row="3" column="1" >body text two</cell>
</row>
</table>
生成想要的正确结果:
<TableElmt>
<HeadingElmt>
<RowElmt>
<CellElmt>heading text one</CellElmt>
</RowElmt>
</HeadingElmt>
<BodyElmt>
<RowElmt>
<CellElmt>body text one</CellElmt>
</RowElmt>
<RowElmt>
<CellElmt>body text two</CellElmt>
</RowElmt>
</BodyElmt>
</TableElmt>