2011-05-30 83 views
1

我有下面的XML:的XPath獲得比賽子列表

<vo class="GroupEntry" buildByAlias="true"> 
     <objectClass name="groupOfNames"/> 
     <field name="commonName"   nameLDAP="cn"   type="String"/> 
     <field name="descriptione"   nameLDAP="description"   type="String"/> 
     <field name="member"    nameLDAP="member"    type="String[]"/> 
    </vo> 
    <update method="addMember" modificationMode="ADD_ATTRIBUTE"> 
     <input> 
      <field name="member"/>   
      <field name="description"/>   
     </input> 
    </update> 

我使用XSLT來改造它,而我需要的,對於每個更新,得到的VO的字段對應於輸入中定義的字段。這將是這樣的:

<xsl:variable name="fields" select="vo/field" /> 
<xsl:for-each select="update"> 
    <xsl:variable name='fieldsForInput' select = "$fields[@name]=input/fields[@name]"/> 
    <xsl:for-each select="$fieldsForInput"> 
     <xsl:value-of select="@type"/> <xsl:value-of select="@name"/> 
    <xsl:for-each> 
</xsl:for-each> 

但它沒有發現任何東西。有任何想法嗎?

感謝

JL

+0

好問題,1。查看我的答案,獲取兩種不同的,完整的,簡短的解決方案。 – 2011-05-31 01:44:24

回答

1

從顯示片段就很難幫助您和understadning你想要什麼。然而你的情況似乎是使用xsl:key的完美選擇。

例如,如果您創建在的開始密鑰轉換是這樣的:

<xsl:key name="fields" match="vo/field" use="@name"/> 

您可以按如下方式使用它您匹配的模板中:

 <xsl:for-each select="update/input"> 
      <xsl:copy-of select="key('fields',current()/field/@name)"/> 
     </xsl:for-each> 

我不會用無論如何,一個xsl:foreach。但是如果只提供片段,很難給你一個完整的解決方案。目前還不清楚,如果你只想匹配或取代field


實施例示出了如何獲得字段name/type每個update/input/field

XSLT 1.0測試撒克遜6.5。5

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="fields" match="vo/field" use="@name"/> 

<xsl:template match="/root"> 
    <xsl:apply-templates select="update"/> 
</xsl:template> 

<xsl:template match="update"> 
    <xsl:value-of select="concat('-',@method,'&#xA;')"/> 
    <xsl:apply-templates select="input/field"/> 
</xsl:template> 

<xsl:template match="input/field"> 
    <xsl:value-of select="concat('--',@name,' ',key('fields',@name)/@type,'&#xA;')"/> 
</xsl:template> 

</xsl:stylesheet> 

應用上:

<root> 
    <vo class="GroupEntry" buildByAlias="true"> 
     <objectClass name="groupOfNames"/> 
     <field name="commonName"   nameLDAP="cn"   type="String"/> 
     <field name="description"   nameLDAP="description"   type="String"/> 
     <field name="member"    nameLDAP="member"    type="String[]"/> 
    </vo> 
    <update method="addMember" modificationMode="ADD_ATTRIBUTE"> 
     <input> 
      <field name="member"/>   
      <field name="description"/>   
     </input> 
    </update> 
     <update method="deleteMember" modificationMode="DELETE_ATTRIBUTE"> 
     <input> 
      <field name="member"/>   
      <field name="description"/>   
     </input> 
    </update> 
</root> 

產地:

-addMember 
--member String[] 
--description String 
-deleteMember 
--member String[] 
--description String 
+0

那麼,我只是爲了匹配領域。問題是我需要更新/輸入中定義的每個字段,vo中的匹配字段,所以我不需要在輸入中定義類型和名稱LDAP,只需在輸入中進行引用,然後獲取來自vo的值。 – 2011-05-30 23:48:35

+0

我剛剛編輯的問題,以澄清我需要什麼。 – 2011-05-30 23:52:09

+0

如果你想澄清你需要什麼,你應該提供你的輸出的XML樣本。既然你已經接受了答案,我認爲你現在已經完成了。你是? – 2011-05-31 03:53:04

0

兩種解決方案:

解決方法1(無鍵):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match= 
    "vo/field[@name=../../update/*/*/@name]"> 

    <xsl:value-of select="concat(@name,' ',@type,'&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加(校正爲進行良好的形成):

<t> 
    <vo class="GroupEntry" buildByAlias="true"> 
     <objectClass name="groupOfNames"/> 
     <field name="commonName" nameLDAP="cn" type="String"/> 
     <field name="description" nameLDAP="description" type="String"/> 
     <field name="member" nameLDAP="member" type="String[]"/> 
    </vo> 
    <update method="addMember" modificationMode="ADD_ATTRIBUTE"> 
     <input> 
      <field name="member"/> 
      <field name="description"/> 
     </input> 
    </update> 
</t> 

有用,正確的結果產生

description String 
member String[] 

溶液2(使用密鑰):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kFieldByName" match="vo/field" 
    use="@name"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates mode="selected" select= 
    "key('kFieldByName', update/*/*/@name)"/> 
</xsl:template> 

<xsl:template match="vo/field" mode="selected"> 
    <xsl:value-of select="concat(@name,' ',@type,'&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

當對相同的XML文檔(以上)應用中,相同的正確的結果產生

description String 
member String[]