如何使用xslt在特定的xml上运行xpath

时间:2018-05-24 10:21:21

标签: xml xslt xpath

问题与我在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

的代码

对于我来说,在这个场景中也可以使用相同的早期解决方案进行更新。

1 个答案:

答案 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>
正在生成

,请参阅enter image description here

我目前不确定如何从/Request/Payload/root/req2=suman推断出涉及阵列成员。