XML Tutorial/XSLT stylesheet/id — различия между версиями

Материал из Web эксперт
Перейти к: навигация, поиск
 
м (1 версия)
 
(нет различий)

Текущая версия на 08:26, 26 мая 2010

Compare id

File: Data.xml
<?xml version="1.0" encoding="US-ASCII"?>
<?xml-stylesheet href="Transform.xslt" type="text/xsl"?>
<uscities>
 <western>
  <uscity state="Nevada">Las Vegas</uscity>
  <uscity state="Arizona">Phoenix</uscity>
  <uscity state="California">San Francisco</uscity>
  <uscity state="Nevada">Silver City</uscity>
  <uscity state="Washington">Seattle</uscity>
  <uscity state="Montana">Missoula</uscity>
 </western>
</uscities>
File: Transform.xslt
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:key name="list" match="uscity" use="@state" />
  <xsl:template match="/">
    <html>
      <head>
        <title>Western State Cities</title>
      </head>
      <body>
        <xsl:for-each
          select="/uscities/western/uscity[generate-id(.)=generate-id(key("list", @state))]/@state">
          <xsl:sort />
          <h2>
            <xsl:value-of select="." />
          </h2>
          <ul>
            <xsl:for-each select="key("list", .)">
              <xsl:sort />
              <li>
                <xsl:value-of select="." />
              </li>
            </xsl:for-each>
          </ul>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
Output:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Western State Cities</title>
   </head><body>
      <h2>Arizona</h2>
      <ul>
         <li>Phoenix</li>
      </ul>
      <h2>California</h2>
      <ul>
         <li>San Francisco</li>
      </ul>
      <h2>Montana</h2>
      <ul>
         <li>Missoula</li>
      </ul>
      <h2>Nevada</h2>
      <ul>
         <li>Las Vegas</li>
         <li>Silver City</li>
      </ul>
      <h2>Washington</h2>
      <ul>
         <li>Seattle</li>
      </ul>
   </body>
</html>


Here is a test of the id()

File: Data.xml
<?xml version="1.0"?>
<parts-list>
  <component component-id="1111111">
    <name>Book</name>
    <partref refid="1"/>
    <partref refid="2"/>
    <partref refid="3"/>
    <partref refid="4"/>
    <description>
       
        <partref refid="3"/>.
    </description>
  </component>
  <component component-id="5">
    <name>name 1</name>
    <partref refid="6"/>
    <partref refid="7"/>
    <description>
      <partref refid="6"/> and a 
      <partref refid="7"/>.
    </description>
  </component>
  <part part-id="6" supplier="4839">
    <name>Pitter</name>
    <description>
      desc6
    </description>
  </part>
  <part part-id="7" supplier="2983">
    <name>Patter</name>
    <description>
      desc7
    </description>
  </part>
  <part part-id="2" supplier="5910">
    <name>Spanner</name>
    <description>
      You can"t fix anything without one.
    </description>
  </part>
  <supplier country="Great Britain" vendor-id="4839">
    <name>A Inc.</name>
  </supplier>
  <supplier country="Germany" vendor-id="2983">
    <name>D</name>
  </supplier>
  <supplier country="Great Britain" vendor-id="5910">
    <name>U Ltd.</name>
  </supplier>
</parts-list>
File: Transform.xslt
<?xml version="1.0"?>
<!-- id2.xsl -->
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:text>&#xA;Here is a test of the id() </xsl:text>
    <xsl:text>function in reverse:&#xA;</xsl:text>
    <xsl:for-each select="/parts-list/part">
      <xsl:text>&#xA;  </xsl:text>
      <xsl:value-of select="name"/>
      <xsl:text> (part #</xsl:text>
      <xsl:value-of select="@part-id"/>
      <xsl:text>) is used in these products:&#xA;    </xsl:text>
      <xsl:for-each 
        select="/parts-list/component
                [partref/@refid=current()/@part-id]">
        <xsl:value-of select="name"/>
        <xsl:if test="position() != last()">
          <xsl:text>&#xA;    </xsl:text>
        </xsl:if>
      </xsl:for-each>
      <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
Output:

  
  
    
Here is a test of the id() 
    function in reverse:

    
      
  
      
       (part #
      
      ) is used in these products:


id() takes a string as its argument and returns a node-set containing any node that has an attribute of type ID equal to the function"s argument

File: Data.xml
<?xml version="1.0"?>
<parts-list>
  <component component-id="1111111">
    <name>Book</name>
    <partref refid="1"/>
    <partref refid="2"/>
    <partref refid="3"/>
    <partref refid="4"/>
    <description>
        <partref refid="3"/>.
    </description>
  </component>
  <component component-id="5">
    <name>name 1</name>
    <partref refid="6"/>
    <partref refid="7"/>
    <description>
      <partref refid="6"/> and a 
      <partref refid="7"/>.
    </description>
  </component>
  <part part-id="6" supplier="4839">
    <name>Pitter</name>
    <description>
      desc6
    </description>
  </part>
  <part part-id="7" supplier="2983">
    <name>Patter</name>
    <description>
      desc7
    </description>
  </part>
  <part part-id="2" supplier="5910">
    <name>Spanner</name>
    <description>
      You can"t fix anything without one.
    </description>
  </part>
  <supplier country="Great Britain" vendor-id="4839">
    <name>A Inc.</name>
  </supplier>
  <supplier country="Germany" vendor-id="2983">
    <name>D</name>
  </supplier>
  <supplier country="Great Britain" vendor-id="5910">
    <name>U Ltd.</name>
  </supplier>
</parts-list>
File: Transform.xslt
<?xml version="1.0"?>
<!-- id1.xsl -->
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:text>&#xA;Here is a test of the id() </xsl:text>
    <xsl:text>function:&#xA;</xsl:text>
    <xsl:for-each select="/parts-list/component">
      <xsl:text>&#xA;  </xsl:text>
      <xsl:value-of select="name"/>
      <xsl:text> (component #</xsl:text>
      <xsl:value-of select="@component-id"/>
      <xsl:text>) uses these parts:&#xA;    </xsl:text>
      <xsl:for-each select="id(partref/@refid)">
        <xsl:value-of select="name"/>
        <xsl:text>&#xA;    </xsl:text>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
Output:

Here is a test of the id() function:
  Book (component #1111111) uses these parts:
    
  name 1 (component #5) uses these parts:


select by id()

File: Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<provinces>
 <province id="AB">
  <name>Alberta</name>
  <abbreviation>AB</abbreviation>
 </province>
 <province id="BC">
  <name>British Columbia</name>
  <abbreviation>BC</abbreviation>
 </province>
 <province id="MB">
  <name>Manitoba</name>
  <abbreviation>MB</abbreviation>
 </province>
 <province id="NB">
  <name>New Brunswick</name>
  <abbreviation>NB</abbreviation>
 </province>
</provinces>

File: Transform.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />
  <xsl:template match="provinces">
    <xsl:apply-templates select="id("NU")" />
  </xsl:template>
  <xsl:template match="id("NU")">
    <xsl:value-of select="name" />
  </xsl:template>
</xsl:stylesheet>


The id function selects elements by their unique ID.

File: Data.xml
<?xml version="1.0" encoding="utf-8"?>
<data>
  <chapter id="intro">Introduction</chapter>
  <chapter id="body">
    <title id="t1">BODY</title>
    <text value="text1">text text text</text>
  </chapter>
  <chapter id="end">THE END</chapter>
</data>
File: Transform.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <paragraph>
        <xsl:value-of select="id("intro")"/>
      </P>
      <paragraph>
        <xsl:value-of select="id("body")/text"/>
      </P>
      <paragraph>
        <xsl:value-of select="id("text1")"/>
      </P>
    </xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?><P/><P/><P/>