Получение родительского значения из xml - PullRequest
1 голос
/ 03 февраля 2012

У меня есть такой вид XML

<?xml version="1.0" encoding="UTF-8"?>
<setting>
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
  <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
  <Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 1" />
  <Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
  <Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
 <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
    <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
    <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name1" />
 </Key>
 <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
    <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
    <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name2" />
 </Key>
</Key>
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
  <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
  <Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 2" />
  <Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
  <Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
    <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
    <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name3" />
</Key>
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
    <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
    <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name4" />
  </Key>
 </Key>
</setting>

И я хотел бы получить rsv-group-name data = "value" из rsv-login-name data = "value"

то есть я даю парсеру name3 и хочу, чтобы он возвращал группу 2

как я до сих пор подходил, вот это:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="umm" match="Value" use="@data"/>
<xsl:key name="amm" match="Value" use="@name"/>
<xsl:template match="/">
<xsl:for-each select="key('umm','name3')">
 <p>    
<xsl:value-of select="../../@name" />
 </p> 
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> 

Ведьма дает мне "com.ahsay.afc.cpf.UserGroup" не совсем лучший результат:)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Решение, использующее ключи для эффективности:

<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="kValueByData" match="Value" use="@data"/>

 <xsl:key name="kValueByKeyAndName" match="Value"
  use="concat(generate-id(..), '+', @name)"/>

 <xsl:template match="/">
     <xsl:value-of select=
     "key('kValueByKeyAndName',
          concat(generate-id(key('kValueByData', 'name3')/../..),
                       '+',
                       'rsv-group-name'
                 )
          )
           /@data
    "/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML :

<setting>
    <Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
        <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
        <Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 1" />
        <Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
        <Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
        <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
            <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
            <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name1" />
        </Key>
        <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
            <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
            <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name2" />
        </Key>
    </Key>
    <Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
        <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
        <Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 2" />
        <Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
        <Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
        <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
            <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
            <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name3" />
        </Key>
        <Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
            <Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
            <Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name4" />
        </Key>
    </Key>
</setting>

желаемый, правильный результат выдается :

group 2
0 голосов
/ 03 февраля 2012

Попробуйте это:

<xsl:value-of select="../../Value[@name = 'rsv-group-name']/@data"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...