多文档xslt,值与添加行为不端

时间:2012-08-16 09:48:19

标签: xslt

我正在尝试为另一个人写一些东西而且我仍然坚持在样式表的最后部分。

我们有两个XML文档:

TestXML.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"/>行上,<title>的值为'22016',<records>的值为22025。有人可以告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分: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元素的字符串值,该元素是其子节点的串联,而您希望访问与第一个文档中位置相同的子元素

答案 1 :(得分: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>