xslt中的3级匹配

时间:2014-08-16 18:36:04

标签: xml xslt xslt-1.0

我的输入xml如下所示

<a>  
 <b>
  <b1>ID1</b1> 
  <b2>text1</b2>
  <b3>c10</b3>
  <b3>c20</b3>
 </b>
  <b>
  <b1>ID2</b1> 
  <b2>text2</b2>
  <b3>c10</b3>
 </b>
  <b>
  <b1>ID3</b1> 
  <b2>text3</b2>
  <b3>c20</b3>
 </b>
  <c>
   <c1>c10</c1>
   <c2>text123<c2>
   <c3>d10</c3>
  </c>
  <c>
   <c1>c20</c1>
   <c2>text123<c2>
   <c3>d20</c3>
   </c>
   <d>
    <d1>d10</d1>
    <d2>text11</d2>
    <d3>10</d3>
   </d>
   <d>
    <d1>d20</d1>
    <d2>text33</d2>
    <d3>20</d3> 
   </d>
</a>

我想对相应<d3>内的相应<d1>值的<c>值求和,该值最终属于<b>。 输出应该看起来像

<b>
 <b1>ID1</b1>
 <b4>30</b4>
<b>
<b>
 <b1>ID2</b1>
 <b4>10</b4>
<b>
<b>
 <b1>ID3</b1>
 <b4>20</b4>
<b>

1 个答案:

答案 0 :(得分:1)

您请求的输出格式不正确:它缺少根元素:

以下样式表:

XSLT 1.0

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

<xsl:key name="c" match="c" use="c1" />
<xsl:key name="d" match="d" use="d1" />

<xsl:template match="/">
    <a>
        <xsl:for-each select="a/b">
            <b>
                <xsl:copy-of select="b1"/>
                <b4>
                    <xsl:value-of select="sum(key('d', key('c', b3)/c3)/d3)"/>
                </b4>
            </b>
        </xsl:for-each>
    </a>
</xsl:template>

</xsl:stylesheet>

当应用于您的输入时(在更正未闭合的元素之后),将返回:

<?xml version="1.0" encoding="UTF-8"?>
<a>
   <b>
      <b1>ID1</b1>
      <b4>30</b4>
   </b>
   <b>
      <b1>ID2</b1>
      <b4>10</b4>
   </b>
   <b>
      <b1>ID3</b1>
      <b4>20</b4>
   </b>
</a>

注意:

以下情况:

<b>
    <b1>ID1</b1> 
    <b2>text1</b2>
    <b3>c10</b3>
    <b3>c10</b3>
</b>

总和的结果将是10,而不是 - 正如您可能期望的那样 - 20.有了这样一个抽象的例子,没有关于数据含义的线索,很难说是否这是正确的方法。