2014-07-04 122 views
0

我有以下XMLXSLT匹配

<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> 
  • 節點:跨度屬性: HyperlinkRangeStart AnnotationID =「1」和HyperlinkRangeEnd AnnotationID =「1」之間的文本是網址內容。
  • 跨越HyperlinkRangeStart和HyperlinkRangeEnd上下的文本將是普通文本。
  • 段落可以有多個URL。每個網址範圍都有唯一的AnnotationID。
  • 我不知道如何通過屬性id與不同的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