2010-07-30 37 views
1

假設我有一個XML,如下所示。Python XML和XPath來整理出來

<a> 
<b> 
    <c>A</c> 
</b> 
<bb> 
    <c>B</c> 
</bb> 
<c> 
    X 
</c> 
</a> 

我需要解析此XML到字典中X爲A/B/C和A/B'/ C,但字典Y代表的A/C。

dictionary X 
X[a_b_c] = A 
X[a_bb_c] = B 

dictionary T 
T[a_c] = X 
  • 問:我想使用XPath做出映射文件在這個XML文件中。我怎樣才能做到這一點?

我想到了如下的mapping.xml。

<mapping> 
    <from>a/c</from><to>dictionary T<to> 
    .... 
</mapping> 

然後用'a/c'來得到X,並把它放在字典T中。有沒有更好的方法可以去?

回答

1

也許你可以用XSLT做到這一點。這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:key name="dict" match="item" use="@dict"/> 
    <xsl:key name="path" match="*[not(*)]" use="concat(name(../..),'/', 
                name(..),'/', 
                name())"/> 
    <xsl:variable name="map"> 
     <item path="a/b/c" dict="X"/> 
     <item path="a/bb/c" dict="X"/> 
     <item path="https://stackoverflow.com/a/c" dict="T"/> 
    </xsl:variable> 
    <xsl:template match="/"> 
     <xsl:variable name="input" select="."/> 
     <xsl:for-each select="document('')/*/xsl:variable[@name='map']/*[count(.|key('dict',@dict)[1])=1]"> 
      <xsl:variable name="dict" select="@dict"/> 
      <xsl:variable name="path" select="../item[@dict=$dict]/@path"/> 
      <xsl:value-of select="concat('dictionary ',$dict,'&#xA;')"/> 
      <xsl:for-each select="$input"> 
       <xsl:apply-templates select="key('path',$path)"> 
        <xsl:with-param name="dict" select="$dict"/> 
       </xsl:apply-templates> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="*"> 
     <xsl:param name="dict"/> 
     <xsl:variable name="path" select="concat(name(../..),'_', 
               name(..),'_', 
               name())"/> 
     <xsl:value-of select="concat($dict,'[', 
            translate(substring($path, 
                 1, 
                 1), 
               '_', 
               ''), 
            substring($path,2),'] = ', 
            normalize-space(.),'&#xA;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

dictionary X 
X[a_b_c] = A 
X[a_bb_c] = B 
dictionary T 
T[a_c] = X 

編輯:漂亮的東西有點。