1

システムから取得した XML を、XSLT を使用する顧客に必要な新しい XML 形式に変換する小さなアプリケーションを作成しました。問題は、XML ノードの値を取得できないように見えることです。それらはすべて空です。

ここに私のXSLTファイルがあります:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <test>
      <xsl:apply-templates select="SourceEndpoint" />
    </test>
  </xsl:template>

  <xsl:template match="SourceEndpoint">
    <InvoiceAmount>
      <xsl:value-of select="." />
    </InvoiceAmount>
  </xsl:template>
</xsl:stylesheet>

私の元の XML には というノードがあるSourceEndpointので、ここで何が間違っているのかわかりません。

私も試しました:<xsl:value-of select="Envelope/Header/SourceEndpoint" />テンプレートの代わりに、同じ結果が得られました

編集

これが私の元の XML のスニペットです。

<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
  <Header>
    <MessageId>{11EA62F5-543A-4483-B216-91E526AE2319}</MessageId> 
    <SourceEndpoint>Test</SourceEndpoint> 
    <DestinationEndpoint>TestInvoice</DestinationEndpoint> 
  </Header>
</Envelope>

Envelopeファイル全体のルートです

変換された XML では、test は次のようになります。<test />

4

2 に答える 2

2

XMLファイルはデフォルトの名前空間にあります-「null」名前空間ではありません。これは大きな違いになります。

XPathとデフォルトの名前空間を検索すると、多くの良い答えが見つかります。

基本的に、プレフィックス(たとえば「x」)を関連付けるXSLT変換で同じ名前空間を定義する必要があります。

次に、任意のXPath式(一致パターンはXPath式の一種です)で、のx:someName代わりにを使用しsomeNameます。

提供されたコードに関するもう1つの問題SourceEndpointは、ドキュメントの最上位要素として要素にアクセスしようとすることです。この場合、最上位要素の名前は異なります。

これらの2つの問題を修正すると、次の変換が行われます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://schemas.microsoft.com/dynamics/2008/01/documents/Message"
 exclude-result-prefixes="x">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <test>
            <xsl:apply-templates select="/*/*/x:SourceEndpoint" />
        </test>
    </xsl:template>

    <xsl:template match="x:SourceEndpoint">
        <InvoiceAmount>
            <xsl:value-of select="." />
        </InvoiceAmount>
    </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
    <Header>
        <MessageId>{11EA62F5-543A-4483-B216-91E526AE2319}</MessageId>
        <SourceEndpoint>Test</SourceEndpoint>
        <DestinationEndpoint>TestInvoice</DestinationEndpoint>
    </Header>
</Envelope>

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

<?xml version="1.0" encoding="utf-8"?>
<test>
   <InvoiceAmount>Test</InvoiceAmount>
</test>
于 2012-10-11T12:41:49.943 に答える
0

ノードの値を取得するには

  <xsl:template match="//SourceEndpoint">
    <InvoiceAmount>
      <xsl:value-of select="./text()" />
    </InvoiceAmount>
  </xsl:template>
于 2012-10-11T12:12:35.630 に答える