其目的是在叶级将多级重复的xml扁平化为xpath;这样我们就可以将它存储在键值存储中并检索它。假设每个重复节点都有一个UID。
编辑并用一个更简单的xml替换了以前的xml。
示例xml如下所示
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car uid="WxiMr123">
<carDoor uid="WRP2">
<location uid="loc-1">
<width uom="ft">2</width>
<height uom="ft">3</height>
</location>
<location uid="loc-2">
<width uom="m">5</width>
<height uom="m">7</height>
</location>
</carDoor>
<commonData>
<timeCreated>2001-04-30T08:15:00.000Z</timeCreated>
</commonData>
</car>
</cars>我看到的xpath K,V对应该看起来像
/cars/car[@uid="WxiMr123"]@uid , "WxiMr123"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]@uid, "WRP2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]@uid, "loc-1"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/text(), "2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/text(), "3"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]@uid, "loc-2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/text(), "5"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/text(), "7"
/cars/car[@uid="WxiMr123"]/commonData/timeCreated/text(), "2001-04-30T08:15:00.000Z"任何帮助都是非常感谢的。
发布于 2015-02-07 21:45:50
制作所需的文件并不那么困难。例如,以下样式表:
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="//text() | //@*[string()]">
<xsl:for-each select="ancestor::*">
<xsl:value-of select="concat('/', name())" />
<xsl:for-each select="@*">
<xsl:value-of select="concat('[@', name(), '="', ., '"]')" />
</xsl:for-each>
</xsl:for-each>
<xsl:choose>
<xsl:when test="name()">
<xsl:value-of select="concat('/@', name())" />
</xsl:when>
<xsl:otherwise>/text()</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="concat(', "', ., '" ')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>当应用于示例输入时,将生成以下结果
/cars/car[@uid="WxiMr123"]/@uid, "WxiMr123"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/@uid, "WRP2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/@uid, "loc-1"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/width[@uom="ft"]/text(), "2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/@uom, "ft"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-1"]/height[@uom="ft"]/text(), "3"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/@uid, "loc-2"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/width[@uom="m"]/text(), "5"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/@uom, "m"
/cars/car[@uid="WxiMr123"]/carDoor[@uid="WRP2"]/location[@uid="loc-2"]/height[@uom="m"]/text(), "7"
/cars/car[@uid="WxiMr123"]/commonData/timeCreated/text(), "2001-04-30T08:15:00.000Z"Note
https://stackoverflow.com/questions/28385062
复制相似问题