我有以下XML
<entry>
<cit>
<level type="higher">
<part>higher1</part>
<part>higher2</part>
</level>
<level type="medium">
<combination>medium1 medium2</combination>
<part>medium1</part>
<part>medium2</part>
</level>
</cit>
<cit>
<level type="higher">
<part>higherA</part>
<part>higherB</part>
<part>higherC</part>
</level>
<level type="medium">
<combination>mediumA mediumB</combination>
<part>mediumA</part>
<part>mediumB</part>
<part>mediumC</part>
</level>
</cit>
</entry>
我现在需要进行转换(XSLT 2.0) - 所需的输出类型只是文本 - 它以下列方式组合part
元素的(level
- )子元素:
higher1 : medium1
higher2 : medium2
higherA : mediumA
higherB : mediumB
higherC : mediumC
每个part
兄弟中level
元素的数量始终相等,但我事先并不知道是否有2,3,4或更多part
个元素。
使用以下XSL文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" omit-xml-declaration="yes" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="text()[not(string-length(normalize-space()))]" />
<xsl:template match="text()[string-length(normalize-space()) > 0]">
<xsl:value-of select="translate(.,'

', ' ')" />
</xsl:template>
<xsl:template match="entry">
<xsl:for-each select="cit">
<xsl:for-each select="level[@type='higher']">
<xsl:value-of select="part" />
<xsl:for-each select="./../level[@type='medium']">: <xsl:value-of select="part" />
</xsl:for-each>
</xsl:for-each>
<!--Trigger line break-->
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()[not(string-length(normalize-space()))]" />
<xsl:template match="text()[string-length(normalize-space()) > 0]">
<xsl:value-of select="translate(.,'

', ' ')" />
</xsl:template>
</xsl:stylesheet>
,我只能得到以下输出:
higher1 higher2: medium1 medium2
higherA higherB higherC: mediumA mediumB higherC
为了做到正确,我需要改变什么?谢谢你的提示!
答案 0 :(得分:2)
怎么样:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/entry">
<xsl:for-each select="cit">
<xsl:for-each select="level[@type='higher']/part">
<xsl:variable name="i" select="position()" />
<xsl:value-of select="." />
<xsl:text> : </xsl:text>
<xsl:value-of select="../../level[@type='medium']/part[$i]" />
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>