xslt高效的选择器用法

时间:2010-09-15 14:28:15

标签: xml xslt xpath

我创建的xslt样式表之一有很多用法,例如

<xsl:template match="ProductType">
 <xsl:value-of select="../../Title"/>
</xsl:template>

所以我的问题是,创建一个新的节点集会更有效率,包括所需的数据或者使用params传递吗?

这种情况的最佳做法是什么?

xml将采用以下形式

<product>
<title>the title</title>
<tags>
<producttype>the product type</producttype>
<tags>
</product>

实际模板匹配如下

<xsl:template match="ProductType" xml:space="default">
      <xsl:param name="by" select="by"/>            
      <xsl:choose>
            <xsl:when test="current()='Karaoke MP3+G'">
                  <div class="product-subhead">
                        <h3>Karaoke Song</h3>
                        <h3 class="middle">MP3+G</h3>
                        <h3>100% Legal Download</h3>
                  </div>
                  The track <xsl:value-of select="../../Title"/> is 100% legally covered by MCPS and PPL ensuring the artist <xsl:value-of select="../../Attribution"/> is paid royalties for every sale! Each karaoke track download from Mastermix Digital contains audio and graphics prompts. The song is provided in MP3+G format. Purchase is available through Paypal with all major credit cards.
            </xsl:when> 
            <xsl:when test="current()='Track'">
                  <div class="product-subhead">
                              <h3>Original Version</h3>
                              <h3 class="middle">Available in 320kbps MP3 and WAV</h3>
                              <h3>100% Legal Download</h3>
                        </div>
                        The track <xsl:value-of select="../../Title"/> is 100% legally covered by MCPS and PPL ensuring the artist <xsl:value-of select="../../Attribution"/> is paid royalties for every sale! Each track download from Mastermix Digital is the original artist version and a guaranteed dancefloor filler! The audio is provided in high quality 320kbps mp3 format. Purchase is available through Paypal with all major credit cards.                        
            </xsl:when>
            <xsl:when test="current()='Extended Floorfillers'">
                  <div class="product-subhead">
                              <h3>Extended Version</h3>
                              <h3 class="middle">Available in 320kbps MP3 and WAV</h3>
                              <h3 class="phead3">100% Legal Download</h3>
                        </div>
                        Each extended floorfiller download from Mastermix Digital contains the original artist version mixed to be just that little bit longer! <xsl:value-of select="../../Title"/> is 100% legally covered by MCPS and PPL ensuring the artist <xsl:value-of select="../../Attribution"/> is paid royalties for every sale. The audio is provided in high quality 320kbps mp3 format. Purchase is available through Paypal with all major credit cards.
            </xsl:when>
            <xsl:otherwise>                        
                  <xsl:value-of select="."/>
            </xsl:otherwise> 
      </xsl:choose>
</xsl:template>

和xml的副本如下所示

  <Tracks>
    <Track AlbumArtURL="http://api.3.esh-partner.net/GetThumbnail.ashx?ID=07167B09-6365-4908-BFE6-811039D62D5E" IsBundle="true">
      <ReportingCode>MG00089531</ReportingCode>
      <Title Language="en-gb">Complete Number Ones Collection</Title>
      <ExtendedTitle>Every UK No 1 in one download</ExtendedTitle>
      <ExplicitContent>false</ExplicitContent>
      <Attribution>Various Artists</Attribution>
      <Duration Seconds="0">00:00:00</Duration>
      <GRid>A1-0327D-MG00089531-J</GRid>
      <CatalogNr>MFEG090</CatalogNr>
      <OriginalReleaseFormat>CD</OriginalReleaseFormat>
      <OriginalReleaseDate>2009-08-04</OriginalReleaseDate>
      <ReleaseDate>2009-08-04</ReleaseDate>
      <Description Language="en-gb">
        <Long>One amazing collection! This download contains every single number 1 from the Official UK charts, since the charts began back in 1952 right up to the present day (not including the last 2 months)! That's more than 1,000 tracks, all in 320 KBPS (the highest quality, indistinguishable from quality you would get from a CD). 
Save over £600 compared by buying every download individually!</Long>
      </Description>      
      <Tags>
            <ProductType>Track</ProductType>
      </Tags>
      <Attributes>
        <Attribute Type="Text" Description="PriceCode">AA</Attribute>
        <Attribute Type="LookupValue" Description="Category">MasterMix</Attribute>
      </Attributes>
      <Contributors />
      <PriceBand>Mid/Front Premium</PriceBand>
      <RecompilationRights>Yes</RecompilationRights>
    </Track>
  </Tracks>

2 个答案:

答案 0 :(得分:0)

如果您在XPath中引用../..的用法,我认为这并没有错。

但是如果你在product/title模板的许多子模板中使用product,解决它的一种方法是使用隧道参数:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:template match="product">
    <!-- Do some other stuff here maybe... -->
    <xsl:apply-templates>
      <xsl:with-param name="title" select="title" tunnel="yes"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="tags">
    <!-- ... and some more stuff ... -->
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="ProductType">
    <xsl:param name="title" tunnel="yes"/>
    <xsl:value-of select="$title"/>
  </xsl:template>

</xsl:stylesheet>

通过使用隧道参数,您可以在任何模板中选择它以生成任何子节点。但好的部分是你不必通过所有模板手动发送它不需要标题。

以下是有关隧道参数的更多信息:http://www.xml.com/lpt/a/1386

但是,这种技术需要XSLT 2.0,但您可以在XSLT 1.0中执行相同的操作,但需要注意的是,您需要将参数传递给您正在处理的每个模板。

答案 1 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:h="header"
 exclude-result-prefixes="h">
    <h:header for="Karaoke MP3+G">
        <h1>Karaoke Song</h1>
        <h2>MP3+G</h2>
        <h4>The track</h4>
        <h5>Each karaoke track download from Mastermix Digital contains audio and graphics prompts. The song is provided in MP3+G format.</h5>
    </h:header>
    <h:header for="Track">
        <h1>Original Version</h1>
        <h2>Available in 320kbps MP3 and WAV</h2>
        <h4>The track</h4>
        <h5>Each track download from Mastermix Digital is the original artist version and a guaranteed dancefloor filler! The audio is provided in high quality 320kbps mp3 format.</h5>
    </h:header>
    <h:header for="Extended Floorfillers">
        <h1>Extended Version</h1>
        <h2>Available in 320kbps MP3 and WAV</h2>
        <h3 class="phead3"/>
        <h4>Each extended floorfiller download from Mastermix Digital contains the original artist version mixed to be just that little bit longer!</h4>
        <h5>The audio is provided in high quality 320kbps mp3 format.</h5>
    </h:header>
    <xsl:template match="Track">
        <xsl:variable name="vText" select="document('')/*/h:*[@for=current()/Tags/ProductType]"/>
        <xsl:choose>
            <xsl:when test="$vText">
                <div class="product-subhead">
                    <h3>
                        <xsl:value-of select="$vText/h1"/>
                    </h3>
                    <h3 class="middle">
                        <xsl:value-of select="$vText/h2"/>
                    </h3>
                    <h3>
                        <xsl:copy-of select="$vText/h3/@*"/>
                        <xsl:text>100% Legal Download</xsl:text>
                    </h3>
                </div>
                <xsl:value-of select="$vText/h4"/>
                <xsl:value-of select="Title"/> is 100% legally covered by MCPS and PPL ensuring the artist 
                <xsl:value-of select="Attribution"/> is paid royalties for every sale! 
                <xsl:value-of select="$vText/h5"/> Purchase is available through Paypal with all major credit cards.
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="Tags/ProductType"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

输出:

<div class="product-subhead">
    <h3>Original Version</h3>
    <h3 class="middle">Available in 320kbps MP3 and WAV</h3>
    <h3>100% Legal Download</h3>
</div>
The trackComplete Number Ones Collection is 100% legally covered by MCPS and PPL ensuring the artist 
Various Artists is paid royalties for every sale!
Each track download from Mastermix Digital is the original artist version and a guaranteed dancefloor filler! The audio is provided in high quality 320kbps mp3 format. Purchase is available through Paypal with all major credit cards.