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
Xml xslt空格分隔的属性和匹配_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml xslt空格分隔的属性和匹配

Xml xslt空格分隔的属性和匹配,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有一个如下所示的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">

我有一个如下所示的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>

节点
中的内容属性用空格分隔。我想使用它,并从
节点获取相应内容的名称和版本。因此,每个内容的预期输出类似:

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

名称1
测试1
aaa
1.
我已经成功地处理了前两个必需的节点,但剩下的三个节点仍然无法处理。谢谢你的帮助! 我的xslt是(没有标题声明):


您可以使用键根据
id
属性查找
tag2

<xsl:key name="tag2" match="tag2" use="@id" />
试试这个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>

您可以使用键根据
id
属性查找
tag2

<xsl:key name="tag2" match="tag2" use="@id" />
试试这个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>