4

私は XSLT を初めて使用し、厄介な問題を解決する必要があり、それを解決するための変更はありません。次の例は、私の問題を説明しています。

<a>
  <b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr></Tp><Ref>123456123]]></b1>
  <b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

期待される成果は次のとおりです。

<a>
  <b1>123456123193<b1>
</a>

要素 b1 と b2 を繰り返し処理し、コンテンツを変数に連結する必要があります。次に、Ref 要素のコンテンツを取得して、これを b1 要素に入れる必要があります。次のコードは、フィールド b1 と b2 の内容を連結します。しかし、どのように上記の形式に入れるのですか?????

<xsl:template match="/*">
    <xsl:variable name="vMyVars">
        <xsl:apply-templates select="b1 | b2 " mode="vMyVars"/>
    </xsl:variable>
    <xsl:value-of select="substring($vMyVars, -1, string-length($vMyVars))"/>
</xsl:template>

<xsl:template match="*" mode="vMyVars"/>

<xsl:template match="*[normalize-space()]" mode="vMyVars">
    <xsl:value-of select="."/>
    <!--<xsl:text>, </xsl:text>-->
</xsl:template>

どんなアドバイスでも大歓迎です。よろしくダーク

4

1 に答える 1

4

これには XPath 3.0 (XSLT 3.0) が必要です。使用するだけです:

 parse-xml(concat(/*/b1, /*/b2))/*/Ref/text()

また、CDATA セクション内のテキスト</Tp>(対応する開始タグのない終了タグを含む) を修正する必要があります。これを次のように修正しました: <Tp/>.

提供された XML ドキュメントに対するこの修正により、次のようになりました

<a>
  <b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr></Tp><Ref>123456123]]></b1>
  <b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

上記の XML ドキュメントで上記の XPath 3.0 式を評価すると、必要な正しい結果が得られます。

123456123193

この XQuery 3.0 を使用して BaseX でこれを確認しました:

let $top :=
<a>
  <b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr><Tp/><Ref>123456123]]></b1>
  <b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

 return
    parse-xml(concat($top/b1, $top/b2))/*/Ref/text()

Ⅱ.XSLT 2.0 でのソリューション

XSLT 2.0 は、文字列を XML ドキュメント/フラグメントに解析するための単純な関数または命令を提供しません。

Saxon では、saxon:parse()拡張関数を使用できます。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:saxon="http://saxon.sf.net/">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <xsl:copy-of select="saxon:parse(concat(/*/b1, /*/b2))/*/Ref/text()"/>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに対して Saxon 9.1.07 を使用してこの変換を実行すると、次のようになります

<a>
  <b1><![CDATA[<CdtrRefInf><Issr>XXX</Issr><Tp/><Ref>123456123]]></b1>
  <b2><![CDATA[193</Ref></CdtrRefInf>]]></b2>
</a>

必要な正しい結果が生成されます。

123456123193
于 2013-01-13T03:33:29.870 に答える