1

私は別の人のために何かを書こうとしていますが、スタイルシートの最後の部分に行き詰まっています。

2 つの 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属性が「合計」に等しい場合、2 つのドキュメント ノードの値を結合します。私はこれを使用してこれを行っています:

<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現在、最初のドキュメントと同じ位置にある子要素にアクセスしたいときに、その子孫ノードの連結である 2 番目のドキュメントの完全な要素の文字列値にアクセスしています。

于 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 ドキュメントに適用されると(2 番目のドキュメントは便宜上、変換でインライン化されます):

<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 に答える