2013-09-29 91 views
1

我想通過存在2個子節點的值來選擇節點,例如,給我的對象類型節點的值爲5,objectid節點的值爲2的節點。通過其多個子節點的值選擇單個XML節點

objectid和objecttype組合是唯一的,所以它總是會返回單個結果。

什麼是XSL語句?

<response> 
    <result name="response" numFound="5" start="0"> 
     <doc> 
      <str name="title">Tours</str> 
      <int name="objecttype">5</int> 
      <str name="friendlyurl">tours</str> 
      <str name="avatar">2_156_DSC01511.JPG</str> 
      <int name="objectid">2</int> 
     </doc> 
     <doc> 
      <str name="title">Celebrations Car</str> 
      <int name="objecttype">5</int> 
      <str name="friendlyurl">celebrations-car</str> 
      <str name="avatar">3_583_0509-0257-20x30-framed.jpg</str> 
      <int name="objectid">3</int> 
     </doc> 
    </result> 
</response> 

回答

1

我假設你想要根據子節點來選擇doc節點嗎?如果是的話,鑑於你上面的XML樣本,你就必須創建一個基於兩個謂詞(其中每個人都有自己的斷言它選擇doc的XPath它可能是這個樣子:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="/"> 

     <xsl:copy-of select="response/result/doc[int[@name='objecttype'] = '5' and int[@name='objectid'] = '2']" /> 

    </xsl:template> 

</xsl:stylesheet> 

我已經測試這個本地和輸出是:

<doc> 
    <str name="title">Tours</str> 
    <int name="objecttype">5</int> 
    <str name="friendlyurl">tours</str> 
    <str name="avatar">2_156_DSC01511.JPG</str> 
    <int name="objectid">2</int> 
</doc> 
2

考慮你有你的搜索條件$id$type

如果你有一個小文件:

/response/result/doc[int[@name='objectid']=$id and int[@name='objecttype']=$type] 

如果你有成千上萬<doc>元素:

<xsl:key name="lookup" match="doc" 
     use="concat(int[@name='objectid'],'&#xd;',int[@name='objecttype'])"/> 

... 

    select="key('lookup',concat($id,'&#xd;',$type))" 

這些工作都在XSLT 1.0和XSLT 2.0。

+0

我在3分鐘內擊敗了你,但你獲得了加入'xsl:key'例子的獎勵積分! :) – icyitscold