Тег заголовка на основе позиции в XML - PullRequest
1 голос
/ 12 декабря 2010

Я хотел бы создать тег от h1 до h3 для заголовка на основе его позиции в секции

xml в формате

<sections>
        <section>
            <header>section 1 header</header>
            <image alt="section 1 image alt">imagename.filetype</image>
            <content>section 1 content</content>
        </section>
        <section>
            <header>section 2 header</header>
            <image alt="section 2 image alt">imagename.filetype</image>
            <content>section 2 content</content>
        </section>
        <section>
            <header>section 3 header</header>
            <image alt="section 3 image alt">imagename.filetype</image>
            <content>section 3 content</content>
        </section>
    </sections>

мой вывод будет выглядеть как

<div>
<h1> section 1 header</h1>
<img alt="section 1 image alt" src="imagename.filename"/>
section 1 content
</div>

<div>
<h2> section 2 header</h2>
<img alt="section 2 image alt" src="imagename.filename"/>
section 2 content
</div>

<div>
<h3> section 3 header</h3>
<img alt="section 3 image alt" src="imagename.filename"/>
section 3 content
</div>

Есть ли простой способ сделать это? любые идеи приветствуются!

доброе спасибо Treemonkey

Обновление:

<xsl:template mode="section" match="section">    
        <xsl:apply-templates mode="header" select="header">
            <xsl:with-param name="position">h<xsl:value-of select="position()"/></xsl:with-param>
        </xsl:apply-templates>   
        <img alt="{image/@alt}" src="{image}" />
        <xsl:value-of select="content"/>
    </xsl:template>

    <xsl:template mode="header" match="header">  
    <xsl:param name="position">0</xsl:param>  
        <xsl:element name="{$position}"><xsl:value-of select="."/></xsl:element>    
    </xsl:template>  

используя вышеупомянутый xslt, который является слегка обновленной версией сообщения о хачике

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

Вот полное решение в стиле push :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="section">
  <div>
   <xsl:apply-templates/>
  </div>
 </xsl:template>

 <xsl:template match="header">
  <xsl:element name="h{count(../preceding-sibling::section)+1}">
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
 <xsl:template match="sections|content">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML:

<sections>
    <section>
        <header>section 1 header</header>
        <image alt="section 1 image alt">imagename.filetype</image>
        <content>section 1 content</content>
    </section>
    <section>
        <header>section 2 header</header>
        <image alt="section 2 image alt">imagename.filetype</image>
        <content>section 2 content</content>
    </section>
    <section>
        <header>section 3 header</header>
        <image alt="section 3 image alt">imagename.filetype</image>
        <content>section 3 content</content>
    </section>
</sections>

желаемый, правильный результат получается :

    <div>
       <h1>section 1 header</h1>
       <image alt="section 1 image alt">imagename.filetype</image>
section 1 content
    </div>
    <div>
       <h2>section 2 header</h2>
       <image alt="section 2 image alt">imagename.filetype</image>
section 2 content
    </div>
    <div>
       <h3>section 3 header</h3>
       <image alt="section 3 image alt">imagename.filetype</image>
section 3 content
    </div>
0 голосов
/ 12 декабря 2010

Это не ответ, так как выглядит уродливо, но слишком долго для комментария.Я не уверен, что это лучший способ сделать это, но:

<xsl:template match="section">
    <xsl:apply-templates select="./header">
        <xsl:with-param name="position"><xsl:value-of select="position()"/>
         </xsl:with-param>
    </xsl:apply-templates>
    <!-- section stuff here -->
</xsl:template>

<xsl:template match="header">
    <xsl:param name="position">0</xsl:param>
    <xsl:variable name="tagname"><xsl:value-of select="concat('h', $position)"></xsl:value-of></xsl:variable>
    <xsl:element name="{$tagname}"><xsl:value-of select="."/></xsl:element>
</xsl:template>

Примечание.DocBook и другие языки используют уровень раздела для размещения соответствующего тега заголовка.

...