2013-03-21 85 views
1

我已經創建了一個客戶端來與各種服務器上的Web服務進行通信,並試圖使用XSL格式化XML。這些服務都是從相同的規範創建的,所以它們發出的XML具有相同的格式和xmlns命名空間名稱。我的XSL需要測試特定類型的元素以瞭解如何格式化它們。問題在於服務器之間,他們使用不同的xmlns前綴。我一直在使用的測試是純字符串比較,並沒有將前綴擴展到完整的xmlns,所以比較失敗。我的問題是,有沒有辦法擴大前綴,使字符串比較工程?如何在測試XML元素時讓XSL忽略xmlns前綴

這是一個簡化的例子來說明問題。在 「XSL:如果測試」 行,我需要擴大 「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> 

回答

0

在XSLT 2.0,你可以做

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

在XSLT 2.0,你可以做

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

比JLRishe是一個更完整的解決方案XSLT 1.0將是沿線

<xsl:if test="substring-after(@xsi:type, ':') = 'CreditTx' and 
       namespace::*[name()=substring-before(@xsi:type, ':')] =  
        'http://www.foo.com/2.1/schema'"> 
+0

謝謝!這正是我所期待的。 – user2176753 2013-03-22 07:01:47