XSLT: возможно ли разметить части текста внутри текстового узла, основываясь на положении встроенных элементов внутри окружающего элемента? - PullRequest
2 голосов
/ 27 октября 2011

Или для этого нужно что-то еще сделать?

Например, может это:

<p> <name>William Cuthbert Faulkner</name> (born Falkner, September 25, 1897 – 
July 6, 1962) was an American writer from Oxford, Mississippi. <name>James 
Augustine Aloysius Joyce</name> (2 February 1882 – 13 January 1941) was an Irish
novelist and poet. <name>Adeline Virginia Woolf</name> (pronounced /wʊlf/; 25
January 1882 – 28 March 1941) was an English author, essayist, publisher, and
writer of short stories.</p>

превратиться в это?

<authors> 
  <author>
     <name>William Cuthbert Faulkner</name>
     <description> (born Falkner, September 25, 1897 – July 6, 1962) was an American
     writer from Oxford, Mississippi. </description> 
  </author>
  <author>
     <name>James Augustine Aloysius Joyce</name> 
     <description>(2 February 1882 – 13 January 1941) was an Irish novelist and
     poet.</description>
  </author>
  <author>
    <name>Adeline Virginia Woolf</name>
    <description>(pronounced /wʊlf/; 25 January 1882 – 28 March 1941) was an English
     author, essayist, publisher, and writer of short stories.</description>
  </author>
</authors>

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Вот как я бы это сделал ...

Эта таблица стилей XSLT 1.0:

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

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

  <xsl:template match="p">
    <authors>
      <xsl:apply-templates/>
    </authors>
  </xsl:template>

  <xsl:template match="name">
    <author>
      <name><xsl:value-of select="normalize-space(.)"/></name>
      <description>
        <xsl:value-of select="normalize-space(following-sibling::text()[1])"/>
      </description>
    </author>
  </xsl:template>

  <xsl:template match="text()[preceding-sibling::name[1]]"/>  

</xsl:stylesheet>

выдает следующий вывод применительно к вводу из вашего вопроса:

<authors>
   <author>
      <name>William Cuthbert Faulkner</name>
      <description>(born Falkner, September 25, 1897 – July 6, 1962) was an American writer from Oxford, Mississippi.</description>
   </author>
   <author>
      <name>James Augustine Aloysius Joyce</name>
      <description>(2 February 1882 – 13 January 1941) was an Irish novelist and poet.</description>
   </author>
   <author>
      <name>Adeline Virginia Woolf</name>
      <description>(pronounced /wʊlf/; 25 January 1882 – 28 March 1941) was an English author, essayist, publisher, and writer of short stories.</description>
   </author>
</authors>
0 голосов
/ 27 октября 2011
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <authors>
            <xsl:apply-templates select="p/name"/>
        </authors>
    </xsl:template>

    <xsl:template match="name">
        <author>
            <name>
                <xsl:value-of select="text()"/>
            </name>
            <description>
                <xsl:value-of select="../text()[count(current()/preceding-sibling::*) + 1]"/>
            </description>
        </author>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...