环境: XSLT 1.0
转换将使用partOne
属性中的@field
部分中的每个元素和partTwo
部分中的查找@find
属性,然后输出@value
属性。
我正在使用for-each
循环,并想知道apply-templates
是否有效?
XML
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="file.xslt"?>
<xml>
<partOne>
<target field="hello"/>
<target field="world"/>
</partOne>
<partTwo>
<number input="2" find="hello" value="valone" />
<number input="2" find="world" value="valtwo" />
<number input="2" find="hello" value="valthree" />
<number input="2" find="world" value="valfour" />
</partTwo>
</xml>
XSL
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/xml/partOne/target">
,<xsl:value-of select="@field"/>
<xsl:for-each select="/xml/partTwo/number[@find=current()/@field]">
,<xsl:value-of select="@value"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出
,hello
,valone
,valthree
,world
,valtwo
,valfour
答案 0 :(得分:2)
嗯,改变似乎是直截了当的
<xsl:for-each select="/xml/partTwo/number[@find=current()/@field]">
,<xsl:value-of select="@value"/>
</xsl:for-each>
到
<xsl:apply-templates select="/xml/partTwo/number[@find=current()/@field]"/>
带有模板
<xsl:template match="partTwo/number">
,<xsl:value-of select="@value"/>
</xsl:template>
到目前为止,您的根模板处理了将其更改为
所需的所有元素 <xsl:template match="/">
<xsl:apply-templates select="xml/partOne"/>
</xsl:template>
避免两次处理partTwo元素。
对于交叉引用,您可能希望在两个版本中都使用密钥:
<xsl:key name="ref" match="partTwo/number" use="@find"/>
对于select="key('ref', @field)"
或select="/xml/partTwo/number[@find=current()/@field]"
,然后apply-templates
代替for-each
。