2017-10-13 88 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