2009-02-12 109 views
2

我有類似下面的XML:的XPath搜索

<?xml version="1.0" encoding="UTF-8"?> 
    <Configuration> 
     <Destinations> 
      <Destination name="DEST1" > 
       <From>AMA*</From> 
      </Destination> 

      <Destination name="DEST2" > 
       <From>AMAZON</From> 
      </Destination> 

          <Destination name="DEST3" > 
       <From>EBAY</From> 
      </Destination> 

          <Destination name="DEST4" > 
       <From>*</From> 
      </Destination> 

     </Destinations> 
    </Configuration> 

我要查詢並找出匹配提供的輸入,所有desintations。

如果我指定EBAY,我希望xpath返回節點名稱= DEST3和DEST4(它不關心值),但是如果我指定AMAZON它需要返回DEST1,DEST2和DEST4作爲AMA *在DEST1中支持通配符。

到目前爲止,我的XPath看起來像這樣:

/目的地[(從= '' 或 從= '*'))]/@名稱

如果輸入指定我動態創建XPATH表達式,並插入輸入值字段

我的XML中除了From外還有其他元素。

欣賞是否有人可以指出這一點。

謝謝, Manglu

回答

7

下面的XPath 2.0表達式表達了所需的選擇

/*/*/*[From[matches($pPat, replace(., '\*', '.*'))]] 

說明

  1. $pPat變量包含搜索模式(如'EBAY','亞馬遜'等)。

  2. 標準XPath 2.0函數matches()用於將任何From元素的值與字符串模式相匹配。

  3. 任何From元素的值將轉換爲XPath 2.0支持的標準正則表達式。爲了這個目的,'*'任何occurence(爲了不被視爲在regexs但作爲一個普通的字符采用了特殊的字符'*'轉義爲"\*")由字符串".*"

測試代替:

我已經使用了以下XSLT 2.0轉換並驗證了上述XPath 2.0表達式按預期選擇元素。要使用它,請將全局參數$ pPat的值替換爲任何所需的值。

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes"/> 

    <xsl:param name="pPat" as="xs:string" 
    select="'AMAZON'"/> 

    <xsl:variable name="vsrchResult" as="element()*" 
    select="/*/*/*[From[matches($pPat, replace(., '\*', '.*'))]]"/> 

    <xsl:template match="/"> 
     <xsl:copy-of select="$vsrchResult"/> 
    </xsl:template> 
</xsl:stylesheet> 

當最初提供的XML文檔應用這種轉變:

<Configuration> 
    <Destinations> 
     <Destination name="DEST1" > 
      <From>AMA*</From> 
     </Destination> 
     <Destination name="DEST2" > 
      <From>AMAZON</From> 
     </Destination> 
     <Destination name="DEST3" > 
      <From>EBAY</From> 
     </Destination> 
     <Destination name="DEST4" > 
      <From>*</From> 
     </Destination> 
    </Destinations> 
</Configuration> 

所需的輸出產生

<Destination name="DEST1"> 
      <From>AMA*</From> 
     </Destination><Destination name="DEST2"> 
      <From>AMAZON</From> 
     </Destination><Destination name="DEST4"> 
      <From>*</From> 
     </Destination> 
+0

+1出色答卷! – 2010-11-01 14:52:16