2017-10-13 65 views
0

是否有可能將URL參數轉換爲XML。到XML的URL參數

例子,我有一個網址,Parmeter的字符串:

"firsteName=John&lastName=Doe&birthDate=1970-01-01&..." 

現在我想將字符串轉換爲XML,如:

<root> 
    <firstName>John</firstName> 
    <lastName>Doe</lastName> 
    <birthDate>1970-01-01</birthDate> 
    ... 
</root> 

我試圖來標記使用XPath字符串,但結果並非如此。

輸入字符串是在後續的XML:

<Response> 
    <query> 
    firsteName=John&amp;lastName=Doe&amp;birthDate=1970-01-01  
    </query> 
</Response> 

,我試圖對XML以下XPath:

fn:tokenize(/Response/query/, '&') 

有沒有辦法做到這一點,使用XSLT或XPath?

+0

你能編輯你的問題來顯示你已經試過的代碼嗎?謝謝。 –

+0

在Linux操作系統中很容易 – RomanPerekhrest

回答

0

標記化與當前XPath是容易的:

tokenize($querystring,'&amp;') 

產生串的序列,從該名稱和值可以與substring-before($avs,'=')和`子-之後被提取的每個($ AVS,「=」)。

構建您希望返回的元素需要比XPath更強大的功能。在XQuery中,因爲$querystring包含要解析字符串,下面將返回你想要的root元素:

return element root { 
    for $avs in tokenize($querystring,'&amp;') 
    return for $name in substring-before($avs,'=') 
     return for $val in substring-after($avs,'=') 
       return element { $name } { $val } 
} 

這裏的元素構造函數是不是純粹的XPath 3.0的唯一的事情。

在XSLT(2.0或3.0),

<xsl:element name="root"> 
    <xsl:for-each select="tokenize($querystring,'&amp;')"> 
    <xsl:variable name="name" select="substring-before(.,'=')"/> 
    <xsl:variable name="value" select="substring-after(.,'=')"/> 
    <xsl:element name="{$name}"> 
     <xsl:value-of select="$value"/> 
    </xsl:element> 
    </xsl:for-each> 
</xsl:element> 

兩者的XQuery和XSLT產生

<root> 
    <firsteName>John</firsteName> 
    <lastName>Doe</lastName> 
    <birthDate>1970-01-01</birthDate> 
</root> 

從樣本輸出不同你說在不修正的'拼寫錯誤要firstName'在查詢字符串中。我會留下這樣的改進,例如將參數名稱的修正拼寫爲讀者的練習。

+0

Michael:您是否有理由嵌套FLWOR表達式,而不是使用'let'作爲'$ name'和'$ val'?請原諒格式化,但是: '爲$ avs in tokenize($ querystring,'&') let $ name:= substring-before($ avs,'=') let $ val:= substring-after($ avs ,'=') return元素{$ name} {$ val}' – joewiz

+0

@joewiz:我試圖只保留在XPath中,這樣我可以說表達式中唯一的非XPath構造是元素構造函數。 (所以:不,沒有重要或有趣的原因。) –

+0

啊,我明白了!有趣的,謝謝! – joewiz