的XPath获得比赛子列表

问题描述:

我有下面的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

从显示片段就很难帮助您和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

两种解决方案:

解决方法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[]