1

我正在尝试为另一个人写一些东西,但我被困在样式表的最后一部分。

我们有两个 XML 文档:

测试XML.xml:

<rootNode>
  <header>
    <title agg="sum">1</title>
    <records agg="sum">10</records>
    <number agg="min">5</number>
    </header>
</rootNode>

和 TestXMLTwo.xml:

<rootNode>
  <header>
    <title agg="sum">2</title>
    <records agg="sum">20</records>
    <number agg="min">15</number>
    </header>
</rootNode>

如果节点的agg属性等于“sum”,我们将两个文档节点的值组合起来。我正在使用:

<xsl:param name="InputFileOne">[EditedOut]\TestXML.xml</xsl:param>
<xsl:param name="InputFileTwo">[EditedOut]\TestXMLTwo.xml</xsl:param>

<xsl:template match="node()|@*">
  <xsl:call-template name="ConcatFiles"/>
</xsl:template>

<xsl:template name="ConcatFiles">
  <xsl:variable name="tempStoreDocOne" select ="document($InputFileOne)/rootNode/header" />
  <xsl:variable name="tempStoreDocTwo" select ="document($InputFileTwo)/rootNode/header" />

<xsl:element name="rootNode">
  <xsl:element name="header">

    <xsl:for-each select="$tempStoreDocOne/node()">
      <xsl:choose>

        <xsl:when test="./@agg = 'sum'">
          <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/."/>
          <xsl:element name="{name(.)}">
            <xsl:value-of select=". + $tempElementDocTwo"/>
          </xsl:element>
        </xsl:when>

        <xsl:otherwise>
          <xsl:element name="{name(.)}">
            <xsl:value-of select="."/>
          </xsl:element>
        </xsl:otherwise>

      </xsl:choose>
    </xsl:for-each>

  </xsl:element>
</xsl:element>
</xsl:template>

然而,在这条线上<xsl:value-of select=". + $tempElementDocTwo"/>,我只得到 '22016' 的值<title>和 22025 的<records>. 有人可以告诉我我哪里出错了吗?

4

2 回答 2

3

更改<xsl:for-each select="$tempStoreDocOne/node()"><xsl:for-each select="$tempStoreDocOne/*">,然后添加一个存储位置的变量,即

<xsl:variable name="pos" select="position()"/>

在里面for-each,然后改变

      <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/."/>

      <xsl:variable name="tempElementDocTwo" select ="$tempStoreDocTwo/*[$pos]"/>

当前,您正在访问第二个文档中完整元素的字符串值,header这是其后代节点的串联,而您希望访问与第一个文档中位置相同的子元素。

于 2012-08-16T10:23:43.467 回答
1

这是一个更简单和更短的解决方案(没有明确的条件):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDoc2">
    <rootNode>
        <header>
            <title agg="sum">2</title>
            <records agg="sum">20</records>
            <number agg="min">15</number>
        </header>
    </rootNode>
 </xsl:param>

 <xsl:variable name="vDoc2" select="document('')/*/xsl:param"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="header/*[@agg='sum']">
  <title>
   <xsl:value-of select=
    ". + $vDoc2/*/header/*[name()=name(current()) and @agg='sum']"/>
  </title>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于第一个 XML 文档时(第二个内联在转换中只是为了方便):

<rootNode>
    <header>
        <title agg="sum">1</title>
        <records agg="sum">10</records>
        <number agg="min">5</number>
    </header>
</rootNode>

产生了想要的正确结果

<rootNode>
   <header>
      <title>3</title>
      <title>30</title>
      <number agg="min">5</number>
   </header>
</rootNode>
于 2012-08-16T12:36:28.053 回答