Xslt xpath在子列表中获取匹配项
我得到了以下xml:Xslt xpath在子列表中获取匹配项,xslt,xpath,Xslt,Xpath,我得到了以下xml: <vo class="GroupEntry" buildByAlias="true"> <objectClass name="groupOfNames"/> <field name="commonName" nameLDAP="cn" type="String"/> <field name="descriptione" nam
<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>
<xsl:key name="fields" match="vo/field" use="@name"/>
但它什么也没发现。有什么想法吗
谢谢
JL从所示片段中,很难帮助您了解您想要的内容。但是,您的案例似乎非常适合使用
xsl:key
例如,如果在变换的开始处创建关键点,如下所示:
<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>
<xsl:key name="fields" match="vo/field" use="@name"/>
适用于:
<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>
从所显示的片段中,很难帮助您了解您想要什么。但是,您的案例似乎非常适合使用
xsl:key
例如,如果在变换的开始处创建关键点,如下所示:
<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>
<xsl:key name="fields" match="vo/field" use="@name"/>
适用于:
<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>
两种解决方案:
解决方案1(无键):
解决方案2(使用键):
两种解决方案:
解决方案1(无键):
解决方案2(使用键):
嗯,我只是等着比赛场地。问题是,我需要更新/输入中定义的每个字段,vo中的匹配字段,因此我不需要在输入中定义类型和名称LDAP,只需在输入中进行引用,并从vo中获取值。我只是编辑了问题,以明确我需要什么。如果你想明确你需要什么,您应该提供输出的XML示例。既然你已经接受了答案,我想你现在就完了。是吗?我已经用一些可能更接近您要求的内容扩展了答案。请注意,您的
vo/field/@name
描述中有一个拼写错误。我已将输入文档中的descriptionone
更改为description
。好吧,我只是等待匹配字段。问题是,我需要更新/输入中定义的每个字段,vo中的匹配字段,因此我不需要在输入中定义类型和名称LDAP,只需在输入中进行引用,并从vo中获取值。我只是编辑了问题,以明确我需要什么。如果你想明确你需要什么,您应该提供输出的XML示例。既然你已经接受了答案,我想你现在就完了。是吗?我已经用一些可能更接近您要求的内容扩展了答案。请注意,您的vo/field/@name
描述中有一个拼写错误。我已将输入文档中的descriptionone
更改为description
。问得好,+1。请参阅我的答案,了解两种不同、完整、简短且简单的解决方案。好问题,+1。请参阅我的答案,了解两种不同、完整、简短且简单的解决方案。
description String
member String[]
<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,'
')"/>
</xsl:template>
</xsl:stylesheet>
description String
member String[]