1

我有一个通过 id 属性具有多对多关系的 xml 片段,示例如下:

<root>
  <foolist name="firstlist">
    <foo barid="1" someval="some"/>
    <foo barid="1" someval="other"/>
    <foo barid="2" someval="third"/>
  </foolist>
  <foolist name="secondlist">
  <!-- there might be more foo's here that reference the same
       bars, so foo can't be a child of bar -->
  </foolist>
  <bar id="1" baz="baz" qux="qux"/>
  <bar id="2" bax="baz2" qux="qux2"/>
</root>

说我想得到以下内容:

baz-some-qux
baz-other-qux
baz2-third-qux2

(即在引用项的 baz 和 qux 的值之间插入 someval 的值),我该怎么做?如果我想使用 bar 模板,我需要两个不同的模板。我可能在这里遗漏了一些非常基本的东西,所以我提前道歉。

(编辑:扩展示例)

4

2 回答 2

2

一个有效的解决方案,使用 keys

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFooById" match="foo" use="@barid"/>

 <xsl:template match="bar">
  <xsl:apply-templates select="key('kFooById', @id)" mode="refer">
    <xsl:with-param name="pReferent" select="."/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="foo" mode="refer">
  <xsl:param name="pReferent" select="/.."/>

  <xsl:value-of select=
   "concat($pReferent/@baz,'-',@someval,'-',$pReferent/@qux,'&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档应用此转换时(针对格式正确进行了更正):

<root>
  <foolist name="firstlist">
    <foo barid="1" someval="some"/>
    <foo barid="1" someval="other"/>
    <foo barid="2" someval="third"/>
  </foolist>
  <foolist name="secondlist">
  <!-- there might be more foo's here that reference the same
       bars, so foo can't be a child of bar -->
  </foolist>
  <bar id="1" baz="baz" qux="qux"/>
  <bar id="2" baz="baz2" qux="qux2"/>
</root>

产生了想要的正确结果:

baz-some-qux
baz-other-qux
baz2-third-qux2
于 2013-01-09T13:39:38.643 回答
1

这应该可以解决问题:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="foo">
      <xsl:variable name="matchingBar" select="../../bar[@id = current()/@barid]" />
      <xsl:value-of select="concat($matchingBar/@baz, '-', ./@someval, '-', $matchingBar/@qux, '&#xA0;')" />
    </xsl:template>
</xsl:stylesheet>
于 2013-01-09T10:39:40.727 回答