2016-05-27 2 views
0

У меня есть XML-, как показано ниже:XSLT пробелов атрибут и матч

<root> 
    <tag1 type="TEST" id="111" name="name1" contents="test1 test2 test3"> 
     <othertags></othertags> 
    </tag1> 
    <tag1 type="TEST" id="222" name="name2" contents="test6 test8 test10"> 
     <othertags></othertags> 
    </tag1> 

    <tag2 id="test1" name="aaa" version="1"></tag2> 
    <tag2 id="test2" name="bbb" version="2"></tag2> 
    <tag2 id="test3" name="ccc" version="3"></tag2> 
    <tag2 id="test6" name="fff" version="6"></tag2> 
    <tag2 id="test8" name="hhh" version="8"></tag2> 
    <tag2 id="test10" name="jjj" version="10"></tag2> 

    <othertags></othertags> 
</root> 

атрибут Содержимого в узле <tag1 type="TEST"> отделяются пробелом. Я хотел бы использовать его и получить имя и версию с узла <tag2> для соответствующего содержимого. Таким образом, ожидаемый результат будет что-то вроде для каждого содержания:

<Group> 
<TagName>name1</TagName> 
<ContentID>test1</ContentID> 
<ContentName>aaa</ContentName> 
<Version>1</Version> 
</Group> 

мне удалось обработать первые два необходимых узлов, но осталось застрял с остальными тремя узлами. Цените любую помощь! Мой XSLT является (без объявления заголовка):

<xsl:template match="tag1[@type='TEST']" name="split"> 
    <xsl:param name="sContents" select="@contents"/> 
    <xsl:param name="sName" select="@name"/> 
    <xsl:param name="sContentID" select="'ContentID'"/> 
    <xsl:param name="sTName" select="'TagName'"/> 

    <xsl:if test="string-length($sContents) > 0"> 
    <xsl:variable name="sNextItem" select= 
     "substring-before(concat($sContents, ' '), ' ')"/> 

     <xsl:element name="Group"> 
     <xsl:element name="{$sTName}"> 
    <xsl:value-of select="$sName"/> 
    </xsl:element> 

     <xsl:element name="{$sContentID}"> 
    <xsl:value-of select="$sNextItem"/> 
    </xsl:element> 
    </xsl:element> 

    <xsl:call-template name="split"> 
    <xsl:with-param name="sContents" select= 
        "substring-after($sContents, ' ')"/> 
    <xsl:with-param name="sName" select="$sName"/> 
    <!--xsl:with-param name="sTName" select="$sTName"/> 
    <xsl:with-param name="sContentName" select="$sContentName"/--> 
    </xsl:call-template> 
</xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

ответ

2

Вы можете использовать ключ для просмотра tag2 значения на основе атрибута id

<xsl:key name="tag2" match="tag2" use="@id" /> 

Чтобы получить атрибут name, например, вы просто сделать это:

<xsl:value-of select="key('tag2',$sNextItem)/@name"/> 

Попробуйте XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes" /> 
<xsl:key name="tag2" match="tag2" use="@id" /> 

<xsl:template match="tag1[@type='TEST']" name="split"> 
    <xsl:param name="sContents" select="@contents"/> 
    <xsl:param name="sName" select="@name"/> 
    <xsl:param name="sContentID" select="'ContentID'"/> 
    <xsl:param name="sTName" select="'TagName'"/> 
    <xsl:param name="sContentName" select="'ContentName'"/> 

    <xsl:if test="string-length($sContents) > 0"> 
    <xsl:variable name="sNextItem" select="substring-before(concat($sContents, ' '), ' ')"/> 

     <Group> 
     <xsl:element name="{$sTName}"> 
     <xsl:value-of select="$sName"/> 
     </xsl:element> 

     <xsl:element name="{$sContentID}"> 
     <xsl:value-of select="$sNextItem"/> 
     </xsl:element> 

     <ContentName> 
     <xsl:value-of select="key('tag2',$sNextItem)/@name"/> 
     </ContentName> 

     <Version> 
     <xsl:value-of select="key('tag2',$sNextItem)/@version"/> 
     </Version> 
    </Group> 

    <xsl:call-template name="split"> 
    <xsl:with-param name="sContents" select="substring-after($sContents, ' ')"/> 
    <xsl:with-param name="sName" select="$sName"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы