问题与我在edit specific xml using xpath
的问题几乎相同但现在问题不同了。 xml结构现在差别不大。早期问题的解决方案在这里不起作用。
我有以下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Request">
<map key="Headers">
<string key="Accept">application/json</string>
<string key="Content-Type">application/json</string>
</map>
<map key="Payload">
<map key="root">
<array key="req1">
<string>puneet</string>
<string>taneja</string>
</array>
<array key="req2">
<string>ratan</string>
</array>
</map>
</map>
</map>
</map>
以下是XPATHS
/Request/Headers/Accept=app
/Request/Headers/Content-Type=json
/Request/Payload/root/req1[2]=singh
/Request/Payload/root/req1[1]=pradeep
/Request/Payload/root/req2=suman
我想要更新结果xml如下
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="Request">
<map key="Headers">
<string key="Accept">application/json</string>
<string key="Content-Type">application/json</string>
</map>
<map key="Payload">
<map key="root">
<array key="req1">
<string>pradeep</string>
<string>singh</string>
</array>
<array key="req2">
<string>suman</string>
</array>
</map>
</map>
</map>
</map>
基本上我想使用xslt在给定的xpath上更改我的xml。查看此位置xsltfiddle.liberty-development.net
的代码对于我来说,在这个场景中也可以使用相同的早期解决方案进行更新。
答案 0 :(得分:3)
获取
之类的路径/Request/Payload/root/req1[2]=singh
/Request/Payload/root/req1[1]=pradeep
工作,你可以添加模板
<xsl:template match=".[contains(., '[') and contains(., '=')]" mode="step">
<xsl:if test="position() gt 1">/</xsl:if>
<xsl:sequence select="'*[@key = ''' || substring-before(., '[') || ''']/*[' || replace(., '^[^\[]+\[([0-9]+)\].*$', '$1') || ']'"/>
</xsl:template>
以便像
这样的代码 <xsl:template match="*[@key = 'Request']/*[@key = 'Payload']/*[@key = 'root']/*[@key = 'req1']/*[1]">
<xsl:copy>
<xsl:copy-of select="@*"/>pradeep</xsl:copy>
</xsl:template>
<xsl:template match="*[@key = 'Request']/*[@key = 'Payload']/*[@key = 'root']/*[@key = 'req1']/*[2]">
<xsl:copy>
<xsl:copy-of select="@*"/>singh</xsl:copy>
</xsl:template>
正在生成
我目前不确定如何从/Request/Payload/root/req2=suman
推断出涉及阵列成员。