0

私はSpringIntegrationを使用しています:

<int-xml:xslt-transformer input-channel="partnerTransformation" 
output-channel="serviceChannel" 
xsl-resource="classpath:/META-INF/vendorTransformerXml.xsl"/>

入力XMLメッセージ:

<ns1:persons  xmlns:ns1="http://com.test.xslt/test"  xmlns:ns3="http://universal.consumerrequest.schema.model.tci.ca">
<ns3:person>
    <ns3:name>John</ns3:name>
    <ns3:family>Smith</ns3:family>
</ns3:person>
<ns3:person>
    <ns3:name>Raza</ns3:name>
    <ns3:family>Abbas</ns3:family>
</ns3:person>

およびXSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://com.test.xslt/test" xmlns:ns3="http://universal.consumerrequest.schema.model.tci.ca">


<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="ns1:persons/ns3:person">


<xsl:value-of select="ns3:family"/>
<xsl:value-of select="ns3:name"/>
</xsl:for-each> 
</xsl:template>
</xsl:stylesheet>

それは機能しませんが、namesapceがなくてもうまく機能します。助けていただければ幸いです。

4

1 に答える 1

0

問題は、Java XML パーサーがデフォルトで名前空間を処理する方法にあります。あなたができることがいくつかあります:

  • XSLT トランスフォーマーに渡す前に、入力 XML を String に変換します。これは私のテストではうまくいきます
  • 自分でドキュメントを作成している場合、たとえば

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    Document doc = dbf.newDocumentBuilder().parse(...);
    
  • 名前空間について心配する必要がない場合、おそらく最も簡単な方法は XSLT を変更することです。

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
         xmlns:ns1="http://com.test.xslt/test"
     xmlns:ns3="http://universal.consumerrequest.schema.model.tci.ca">
    
    
     <xsl:output method="text" />
      <xsl:template match="/">
        <xsl:for-each select="//*[local-name()='person']">
           <xsl:value-of select="*[local-name()='family']" />
           <xsl:value-of select="*[local-name()='name']" />
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    
于 2012-09-01T13:14:36.240 に答える