的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
从显示片段就很难帮助您和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,'
')"/>
<xsl:apply-templates select="input/field"/>
</xsl:template>
<xsl:template match="input/field">
<xsl:value-of select="concat('--',@name,' ',key('fields',@name)/@type,'
')"/>
</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
那么,我只是为了匹配领域。问题是我需要更新/输入中定义的每个字段,vo中的匹配字段,所以我不需要在输入中定义类型和名称LDAP,只需在输入中进行引用,然后获取来自vo的值。 – 2011-05-30 23:48:35
我刚刚编辑的问题,以澄清我需要什么。 – 2011-05-30 23:52:09
如果你想澄清你需要什么,你应该提供你的输出的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,'
')"/>
</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,'
')"/>
</xsl:template>
</xsl:stylesheet>
当对相同的XML文档(以上)应用中,相同的正确的结果产生:
description String
member String[]
好问题,1。查看我的答案,获取两种不同的,完整的,简短的解决方案。 – 2011-05-31 01:44:24