给定以下XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record>
<title>TITLE</title>
<key>FIRSTKEY</key>
<value>FIRSTVALUE</value>
</record>
<record>
<title>TITLE</title>
<key>SECONDKEY</key>
<value>SECONDVALUE</key>
</record>
因此,每条记录都有相同的标题。
我想用 XSLT 做的是根据第一个(或任何元素,因为它们都具有相同的标题信息)的信息生成一个标头,但在同一文档中,我想遍历所有节点,有点像这样:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/root">
<doc>
<!-- xsl:select first node -->
<header><title><xsl:value-of select="title"/></title></header>
<!-- /xsl:select -->
<!-- xsl:for-each loop over all nodes, including the one we selected for the header -->
<key><xsl:value-of select="key"/></key>
<value><xsl:value-of select="value"/></value>
<!-- /xsl:for-each -->
</doc>
</xsl:template>
</xsl:transform>
我将如何做到这一点?
如果你使用
<xsl:template match="/root">
<!-- xsl:select first node -->
<header><title><xsl:value-of select="record[1]/title"/></title></header>
<!-- /xsl:select -->
<!-- xsl:for-each loop over all nodes, including the one we selected for the header -->
<xsl:for-each select="record">
<key><xsl:value-of select="key"/></key>
<value><xsl:value-of select="value"/></value>
</xsl:for-each>
<!-- /xsl:for-each -->
</xsl:template>
你应该得到你想要的结果。
但是,我建议使用具有两种模式的基于模板的方法
<xsl:template match="/root">
<xsl:apply-templates select="record[1]" mode="head"/>
<xsl:apply-templates select="record"/>
</xsl:template>
<xsl:template match="record" mode="head">
<header><xsl:copy-of select="title"/></header>
</xsl:template>
<xsl:template match="record">
<xsl:copy-of select="key | value"/>
</xsl:template>