XSLT转换检索元素的子元素及其子子元素

时间:2018-05-18 20:15:53

标签: xml xslt transformation

我正在尝试用xslt转换简单的xml,但是我很容易陷入非常简单的情况,尽管我找不到任何如何正确解决它的例子。这是我的xml结构:

<TrackList>
   <Track no="1">
      <Title>Tin Man</Title>
   </Track >
   <Track no="2">
      <Title>Good Ol Days</Title>
    </Track >
    <Track no="3">
      <Title>Thing That Break</Title>
    </Track >
</TrackList>

我想从TrackList中检索所有曲目,所以我可以:

<TrackList>
   <Track title=""/>
   <Track title=""/>
   <Track title=""/>
</TrackList>

我尝试了以下xslt模板:

<xsl:element name="TrackList">
   <xsl:apply-templates select="TrackList"/>
 </xsl:element>

 <xsl:template match="//TrackList">
    <xsl:element name="Track">
       <xsl:attribute name="title">
          <xsl:value-of select="Track/Title"/>
        </xsl:attribute>
    </xsl:element>
</xsl:template>

虽然我只是正确地提取了第一个元素但其余部分被忽略了,但是有人可以解释并建议如何正确地检索它。

2 个答案:

答案 0 :(得分:1)

如果要转换Track元素,请编写模板

  <xsl:template match="Track">
      <Track title="{Title}"/>
  </xsl:template>

对于他们,通过身份转换模板处理其余部分:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Track">
      <Track title="{Title}"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/94hvTz3

答案 1 :(得分:0)

 <xsl:template match="TrackList">
       <xsl:element name="TrackList">
           <xsl:for-each select="Track">
               <xsl:element name="Track">
                   <xsl:attribute name="title">
                       <xsl:value-of select="Title"/>
                   </xsl:attribute>
               </xsl:element>
           </xsl:for-each>
           </xsl:element>
   </xsl:template>