1

私のxslt:

<xsl:template match="node()">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="soapenv:Body//*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@* | *" />
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="soapenv:Body//@*">
    <xsl:attribute name="{local-name()}">
        <xsl:value-of select="." />
    </xsl:attribute>
</xsl:template>

入力:

<soapenv:Body>
    <Test asdf="asdfasdf">
        <Hope>asdf</Hope>
    </Test>
</soapenv:Body>

出力:

<Test asdf="asdfasdf">
    <Hope>asdf</Hope>
    asdf
</Test>

私の質問は、Hope要素の後に余分なasdfテキストが表示されるのはなぜですか?

4

2 に答える 2

2

要素は、出力に要素を作成するTestによって一致するため、テンプレートをその子に適用し(要素をコピー)、要素自体の文字列値を含むテキストノードを追加します-これは、そのすべての子孫テキストの連結です内のノードを含むノード。<xsl:template match="soapenv:Body//*">TestHopeTestHope

<xsl:value-of>問題の要素に要素の子がない場合にのみ起動することで、これを修正できます。

<xsl:if test="not(*)">

または別のテンプレートを使用してsoapenv:Body//*[*]

于 2013-02-16T15:16:49.680 に答える
2

名前空間を削除したいようです。(なぜですか?これは実際には必要ないはずです!

より慣用的なアプローチを検討してください。

<!-- 1) always try to start off with the identity template -->
<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
</xsl:template>

<!-- 2) only create templates for nodes that need extra processing -->
<xsl:template match="soapenv:*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="node() | @*" />
    </xsl:element>
</xsl:template>

入力結果:

<Body>
    <Test asdf="asdfasdf">
        <Hope>asdf</Hope>
    </Test>
</Body>

編集:本文の内容から出力を開始するだけの場合は、次を使用します。

<xsl:template match="/">
    <xsl:apply-templates select="soapenv:Envelope/soapenv:Body/*" />
</xsl:template>
于 2013-02-16T15:35:18.043 に答える