有没有办法在XSLT转换中用应用模板替换for-each?

有没有办法在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> <

环境: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>
    <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"/>