2014-07-04 3 views
0

У меня есть следующий XMLсоответствия XSLT значение атрибута два различных узлов

<Paragraph> 
    <Span Text="This is " /> 
    <HyperlinkRangeStart AnnotationID="1"> 
    <HyperlinkInfo NavigateUri="http://www.google.com" /> 
    </HyperlinkRangeStart> 
    <Span StyleName="Hyperlink" Text="Go" /> 
    <Span FontWeight="Bold" StyleName="Hyperlink" Text="o" /> 
    <Span StyleName="Hyperlink" Text="gle" /> 
    <HyperlinkRangeEnd AnnotationID="1" /> 
    <Span Text=" search engine" /> 
</Paragraph> 

Я хочу, чтобы преобразовать его в текст Xhtml следующим образом:

<p>This is <a href=http://www.google.com> [Go**o**gle][1]</a> search engine</p> 
  • Node: Span Атрибут: Текст между HyperlinkRangeStart AnnotationID = "1" и HyperlinkRangeEnd AnnotationID = "1" является содержимым URL.
  • Span Text над и под гиперссылками RangeStart и HyperlinkRangeEnd будет обычным текстом.
  • Параграф может содержать до нескольких URL. Каждый диапазон URL будет иметь уникальный идентификатор AnnotationID.
  • Я не знаю, как совместить идентификатор атрибута с другим узлом xml.

Любая помощь очень ценится.

+1

Не уверен, что вы подразумеваете под "xhtml text". Отправьте свой ожидаемый результат ** в виде кода **. Также укажите, используете ли вы XSLT 1.0 или 2.0. –

+0

Это [Go ** o ** gle] [1] поисковая система - ожидаемый результат. – teenboy

+0

Вы хотите, чтобы метод вывода был текстовым? –

ответ

0

Это не совсем тривиально, поэтому позвольте мне немного упрощенный вход, хотя и с множественным (два в моем примере) гиперссылок:

Вход:

<Paragraph> 
    <Span Text="This is " /> 
    <HyperlinkRangeStart AnnotationID="1"> 
     <HyperlinkInfo NavigateUri="http://www.google.com" /> 
    </HyperlinkRangeStart> 
    <Span StyleName="Hyperlink" Text="Go" /> 
    <Span StyleName="Hyperlink" Text="o" /> 
    <Span StyleName="Hyperlink" Text="gle" /> 
    <HyperlinkRangeEnd AnnotationID="1" /> 
    <Span Text=" search engine. " /> 
    <Span Text="That is " /> 
    <HyperlinkRangeStart AnnotationID="2"> 
     <HyperlinkInfo NavigateUri="http://www.bing.com" /> 
    </HyperlinkRangeStart> 
    <Span StyleName="Hyperlink" Text="Bi" /> 
    <Span StyleName="Hyperlink" Text="ng" /> 
    <HyperlinkRangeEnd AnnotationID="2" /> 
    <Span Text=" search motor." /> 
</Paragraph> 

Применив следующую таблицу стилей:

XSLT-1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:key name="URLtext" match="Span[@StyleName='Hyperlink']" use="preceding-sibling::HyperlinkRangeStart[1]/@AnnotationID" /> 

<xsl:template match="Paragraph"> 
    <p> 
     <xsl:apply-templates select="Span[not(@StyleName='Hyperlink')] | HyperlinkRangeStart"/> 
    </p> 
</xsl:template> 

<xsl:template match="HyperlinkRangeStart"> 
    <a href="{HyperlinkInfo/@NavigateUri}"> 
     <xsl:apply-templates select="key('URLtext', @AnnotationID)"/> 
    </a> 
</xsl:template> 

<xsl:template match="Span"> 
    <xsl:value-of select="@Text"/> 
</xsl:template> 

</xsl:stylesheet> 

вернет этот результат:

<?xml version="1.0" encoding="utf-8"?> 
<p>This is <a href="http://www.google.com">Google</a> search engine. That is <a href="http://www.bing.com">Bing</a> search motor.</p> 

Проблема форматирования гипертекстовой ссылки в качестве упражнения для читателя.

+0

большое спасибо. Отличный ответ. Я согласен. – teenboy

Смежные вопросы