Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt xpath在子列表中获取匹配项_Xslt_Xpath - Fatal编程技术网

Xslt xpath在子列表中获取匹配项

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

我得到了以下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>
<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,'&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>
description String
member String[]