2012-09-25 138 views
1
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:t1="http://mynamespace/A" xmlns:top="http://mynamespace/B" 
    xmlns:max="http://mynamespace/C"><soapenv:Body> 
    <t1:Creditcard> 
    <top:AutoPayenroll> 
     <top:CustomerId> 
      <max:CustName>Taylor</max:CustName> 
      <max:CustID>1234</max:CustID> 
     </top:CustomerId> 
    </top:AutoPayenroll> 
    </t1:CreditCard></soapenv:Body></soapenv:Envelope> 

需要將CustID更改爲我所做的加密的一個。但不知道如何將它插入使用xsl將相同的名稱空間添加到xml

使用此XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:t1="http://mynamespace/A" xmlns:top="http://mynamespace/B" 
    xmlns:max="http://mynamespace/C" version="1.0"> 
    <xsl:output method="xml"/><xsl:template match="/"> 
<xsl:apply-templates/> </xsl:template> <xsl:template match="//*[local-name()='CustID']"> 
<xsl:variable name="cleartxt" select="./text()"/> 
<!--got this encrypted data from my internal code--> 
<xsl:variable name="encdata" select="'jksdguasidgeiruh'"/> 
<xsl:element name="//*[local-name()='Pswd']"> 
    <xsl:value-of select="$encdata"/> 
</xsl:element> </xsl:template> <xsl:template match="*"> 
<xsl:copy> <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:copy> </xsl:template> </xsl:stylesheet>  

反應應該是如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t1="http://mynamespace/A" xmlns:top="http://mynamespace/B" xmlns:max="http://mynamespace/C"><soapenv:Body> 
    <t1:Creditcard> 
    <top:AutoPayenroll> 
     <top:CustomerId> 
      <max:CustName>Taylor</max:CustName> 
     <max:CustID>jksdguasidgeiruh</max:CustID> 
     </top:CustomerId> 
    </top:AutoPayenroll> 
    </t1:CreditCard></soapenv:Body></soapenv:Envelope>  
+1

我工作在你的形式打一些。你能編輯你的問題並修復它的其餘部分嗎?這對我們來說會更容易閱讀和理解。 – LarsH

+0

此外,如果您要輸出帶有加密文本內容的「」,並且您的「響應應該是」,但您的XSLT表示您要輸出帶有該內容的「」。你要哪個? – LarsH

+0

請執行@LarsH寫的內容。我們希望網站上的問題能夠正確格式化,以便使用。 – hakre

回答

1

由於max命名空間是在所期望的結果相同(是不是一個不同的一個),你僅需要執行此短而簡單的變換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:max="http://mynamespace/C"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pEncrypted" select="'jksdguasidgeiruh'"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="max:CustID/text()"> 
    <xsl:value-of select="$pEncrypted"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用(校正爲進行良好的形成!):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:t1="http://mynamespace/A" 
xmlns:top="http://mynamespace/B" 
xmlns:max="http://mynamespace/C"> 
    <soapenv:Body> 
     <t1:Creditcard> 
      <top:AutoPayenroll> 
       <top:CustomerId> 
        <max:CustName>Taylor</max:CustName> 
        <max:CustID>1234</max:CustID> 
       </top:CustomerId> 
      </top:AutoPayenroll> 
     </t1:Creditcard> 
    </soapenv:Body> 
</soapenv:Envelope> 

的希望,正確的結果產生

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:t1="http://mynamespace/A" 
xmlns:top="http://mynamespace/B" 
xmlns:max="http://mynamespace/C"> 
    <soapenv:Body> 
     <t1:Creditcard> 
     <top:AutoPayenroll> 
      <top:CustomerId> 
       <max:CustName>Taylor</max:CustName> 
       <max:CustID>jksdguasidgeiruh</max:CustID> 
      </top:CustomerId> 
     </top:AutoPayenroll> 
     </t1:Creditcard> 
    </soapenv:Body> 
</soapenv:Envelope> 

說明:的identity rule/template

正確使用和覆蓋。

更新

的OP在註釋表示該命名空間可以在每個響應不同和預先是未知的。

以下是同樣的解決方案,稍作修改以適應此規範更改;

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pEncrypted" select="'jksdguasidgeiruh'"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[local-name()='CustID']/text()"> 
    <xsl:value-of select="$pEncrypted"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉換應用於同一個XML文檔(上圖),同樣是正確的,通緝的結果產生

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t1="http://mynamespace/A" xmlns:top="http://mynamespace/B" xmlns:max="http://mynamespace/C"> 
    <soapenv:Body> 
     <t1:Creditcard> 
     <top:AutoPayenroll> 
      <top:CustomerId> 
       <max:CustName>Taylor</max:CustName> 
       <max:CustID>jksdguasidgeiruh</max:CustID> 
      </top:CustomerId> 
     </top:AutoPayenroll> 
     </t1:Creditcard> 
    </soapenv:Body> 
</soapenv:Envelope> 

或者更安全的,(在OP中規定另一個評論,名稱空間uri是相同的,只有前綴改變):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pEncrypted" select="'jksdguasidgeiruh'"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"*[local-name()='CustID' and namespace-uri()='http://mynamespace/C']/text()"> 
    <xsl:value-of select="$pEncrypted"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

是同意的,但每次命名空間前綴有時會更改ns1,有時ns2也是如此。所以我想使用那個請求中傳入的內容,而不用在xsl – mnvbrtn

+0

@ user1698404中進行硬編碼,從你的評論中不清楚什麼改變了 - 請解釋一下。 –

+0

命名空間t1,top,max每次都在變化。我的意思是命名空間網址是相同的,但前綴不同 – mnvbrtn

2

你舉的例子XSL和期望的輸出都有點彆扭,但不管。

你有沒有嘗試過這樣的:

<max:Pswd><xsl:value-of select="$encdata"/></max:Pswd> 

換句話說,你並不總是需要使用<xsl:element/>如果僅僅編碼所需的輸出就足夠了。

+0

是的我知道我們可以使用max命名空間,但每次命名空間前綴有時會更改ns1,有時ns2也是如此。所以我想使用它在那個請求中傳入的內容,而不用在xsl – mnvbrtn

+0

中進行硬編碼,我不知道爲什麼要保留任意分配的名稱空間前綴。儘管如此,這些額外的要求讓Dimitre能夠展示一些不錯的技術。 –

0

你不能用xpath來定義你的元素名稱。下面將在max=http://mynamespace/C命名空間替換CustIdPswd,使用身份模板複製一切:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:max="http://mynamespace/C" 
       > 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!--Replace CustID with Pswd--> 
    <xsl:template match="*[local-name()='CustID']"> 
     <xsl:variable name="cleartxt" select="./text()"/> 
     <!--got this encrypted data from my internal code--> 
     <xsl:variable name="encdata" select="'jksdguasidgeiruh'"/> 
     <xsl:element name="max:Pswd"> 
      <xsl:value-of select="$encdata"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet>