有没有办法在XSLT转换中用应用模板替换for-each?
环境:XSLT 1.0有没有办法在XSLT转换中用应用模板替换for-each?,xslt,xslt-1.0,Xslt,Xslt 1.0,环境:XSLT 1.0 转换将获取partOne部分中的每个元素,并使用@find属性在partTwo部分中查找@field属性,然后输出@value属性 我正在为每个循环使用一个,我想知道应用模板是否可行 xml <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="file.xslt"?> <xml> <partOne> <
转换将获取
partOne
部分中的每个元素,并使用@find
属性在partTwo
部分中查找@field
属性,然后输出@value
属性
我正在为每个循环使用一个,我想知道应用模板
是否可行
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>
<?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>
嗯,这似乎是直接的改变
<xsl:for-each select="/xml/partTwo/number[@find=current()/@field]">
,<xsl:value-of select="@value"/>
</xsl:for-each>
,
到
用模板
<xsl:template match="partTwo/number">
,<xsl:value-of select="@value"/>
</xsl:template>
,
到目前为止,根模板处理所有需要更改的元素
<xsl:template match="/">
<xsl:apply-templates select="xml/partOne"/>
</xsl:template>
为避免零件两次加工
对于交叉引用,您可能希望在两个版本中使用密钥:
<xsl:key name="ref" match="partTwo/number" use="@find"/>
然后select=“key('ref',@field)”
而不是select=“/xml/partTwo/number[@find=current()/@field]”
对于apply templates
或对于每个我得到所需的输出,然后一些…,valone,valtwo,valthree,valfour也得到输出,这部分是不正确的。你知道为什么要这样做吗?@Rod,请看编辑,你目前的方法将处理第二部分两次,你需要在模板匹配中更正应用模板。谢谢,这很有效。但是,我认为apply templates
的select
表达式必须与模板的match
表达式完全匹配?选择表达式选择的节点必须与模板规则中的match
模式匹配。例如,通过select=“*”
选择的节点可以将模板规则与match=“para”
匹配,而通过select=“para”
选择的节点可以将规则与match=“*”
@Rod匹配,我添加了一个xsl:key
/key
使用的示例。
<xsl:template match="/">
<xsl:apply-templates select="xml/partOne"/>
</xsl:template>
<xsl:key name="ref" match="partTwo/number" use="@find"/>