2

さまざまなサーバー上の Web サービスと対話するクライアントを作成し、XSL を使用して XML をフォーマットしようとしています。サービスはすべて同じ仕様に基づいて作成されているため、これらのサービスが出力する XML の形式と xmlns 名前空間は同じです。私の XSL は、特定のタイプの要素をテストして、それらをフォーマットする方法を知る必要があります。問題は、サーバー間で異なる xmlns プレフィックスを使用していることです。私が使用しているテストは純粋な文字列比較であり、プレフィックスを完全な xmlns に展開しないため、比較は失敗します。私の質問は、文字列比較が機能するようにプレフィックスを拡張する方法はありますか?

これは、問題を説明するための単純化された例です。「xsl:if test」行では、「r0」と「xx」を「http://www.foo.com/2.1/schema」に展開して、同じテストを行う必要があります。

XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:r0="http://www.foo.com/2.1/schema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsl:template match="/">
<html>
<head>
  </head>
     <body >
        <xsl:for-each select="MyResp/r0:creditVendReceipt/r0:transactions/r0:tx">
          <xsl:if test="@xsi:type='r0:CreditTx'">
                <xsl:value-of select="r0:amt/@value"/>(CR)
          </xsl:if>
          <xsl:if test="@xsi:type='r0:DebitTx'">
                <xsl:value-of select="r0:amt/@value"/>(DB)
          </xsl:if>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XML (これは動作します):

<?xml version="1.0" encoding="unicode"?>
<MyResp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:r0="http://www.foo.com/2.1/schema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<r0:creditVendReceipt receiptNo="1234567890">
    <r0:transactions>
        <r0:tx xsi:type="r0:CreditTx">
            <r0:amt value="100" />
        </r0:tx>
        <r0:tx xsi:type="r0:DebitTx">
            <r0:amt value="50" />
        </r0:tx>
    </r0:transactions>
</r0:creditVendReceipt>
</MyResp>

XML (これは失敗します):

<?xml version="1.0" encoding="unicode"?>
<MyResp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xx="http://www.foo.com/2.1/schema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<xx:creditVendReceipt receiptNo="1234567890">
    <xx:transactions>
        <xx:tx xsi:type="xx:CreditTx">
            <xx:amt value="100" />
        </xx:tx>
        <xx:tx xsi:type="xx:DebitTx">
            <xx:amt value="50" />
        </xx:tx>
    </xx:transactions>
</xx:creditVendReceipt>
</MyResp>
4

2 に答える 2

3

XSLT 2.0 でできること

<xsl:if test='resolve-QName(@xsi:type, .) = 
              QName("http://www.foo.com/2.1/schema", "CreditTx")'>

XSLT 1.0 の JLRishe よりも完全なソリューションは、線に沿っているでしょう。

<xsl:if test="substring-after(@xsi:type, ':') = 'CreditTx' and 
                 namespace::*[name()=substring-before(@xsi:type, ':')] =     
                    'http://www.foo.com/2.1/schema'">
于 2013-03-21T14:02:41.713 に答える
0

XSLT 2.0 でできること

<xsl:if test='resolve-QName(@xsi:type, .) = 
              QName("http://www.foo.com/2.1/schema", "CreditTx")'>
于 2013-03-21T13:57:49.177 に答える