我有以下xml:
<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)
从显示的片段中,很难帮助你,并且无法理解你想要的东西。但是,您的案例似乎非常适合使用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 使用 Saxon 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
答案 1 :(得分: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,'
')"/>
</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[]