我是XSL的新手,也是从头开始解决问题的过程. 我有一个源XML文件,其中包含以下结构: – root Header /Header DetailRecord CustomerNumber1/CustomerNumber DetailSubRecord AddressLondon/Address /DetailSubRecord Deta
我有一个源XML文件,其中包含以下结构: –
<root> <Header> </Header> <DetailRecord> <CustomerNumber>1</CustomerNumber> <DetailSubRecord> <Address>London</Address> </DetailSubRecord> <DetailSubRecord> <Address>Hull</Address> </DetailSubRecord> </DetailRecord> <DetailRecord> <CustomerNumber>2</CustomerNumber> <DetailSubRecord> <Address>Birmingham</Address> </DetailSubRecord> <DetailSubRecord> <Address>Manchester</Address> </DetailSubRecord> </DetailRecord> <Footer> </Footer> </root>
其中有多个< DetailRecord> s,每个都有多个< DetailSubRecord> s.
我已经设法将一个XSL输出到一个平面文件输出一个嵌套的多个DetailRecords,但是我还没有弄清楚如何在XSL中引用第二个嵌套级别的地址记录…
到目前为止,这是我的XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:output method="text"/> <xsl:variable name="spaces" select="' '"/> <xsl:variable name="newline"> <xsl:text> </xsl:text> </xsl:variable> <xsl:template match="/"> <xsl:value-of select="root/Header/HeaderField"/> <xsl:copy-of select="$newline"/> <xsl:for-each select="root/DetailRecord"> <xsl:value-of select="CustomerNumber"/> <xsl:copy-of select="$newline"/> </xsl:for-each> Trailer - recordCount - <xsl:value-of select="count(root/DetailRecord)"/> </xsl:template> </xsl:stylesheet>XSLT是一种功能语言,而不是程序性语言; XSLT的大多数新手都没有意识到,XSLT处理器会按照它们在源中出现的顺序自动处理树中的每个节点.如果没有模板来定义如何处理每个节点,则不输出任何内容.
在大多数情况下,您不需要使用< xsl:for-each>只是为了处理子元素,这已经为您完成了,您只需要定义一个模板来描述您希望如何输出每个元素.像这样:
<xsl:template match="root"> <xsl:apply-templates /> <xsl:text>Trailer - recordCount - </xsl:text> <xsl:value-of select="count(DetailRecord)" /> </xsl:template> <xsl:template match="HeaderField | CustomerNumber | Address"> <xsl:value-of select="concat(.,$newline)" /> </xsl:template> <xsl:template match="DetailSubRecord"> <!-- do something with subrecord here --> <xsl:apply-templates /> </xsl:template>
< xsl:apply-templates />在第一个模板中只是告诉XSLT处理器处理子元素,之后它会添加记录计数.
第二个模板处理任何元素,其中三个名称匹配atrtibute,并且在每种情况下输出与新行连接的内容(.).
它当前形式的第三个模板实际上是多余的,处理器无论如何都会这样做,但你可以用更有用的东西替换那个注释.
您会注意到这没有提供有关如何处理DetailRecord元素的任何信息;因为你要做的只是处理它的孩子,你不需要指定任何东西,因为它被视为给定的.