Из приведенных фрагментов трудно помочь вам и понять, чего вы хотите.Однако ваш случай кажется идеальным для использования 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
.
XSLT1.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