我有如下的XML:
<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">
中的contents属性由空格分隔。我想使用它并从<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>
答案 0 :(得分: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>