Xml 按两个不同节点的属性值进行XSLT匹配

Xml 按两个不同节点的属性值进行XSLT匹配,xml,xslt,Xml,Xslt,我有以下xml <Paragraph> <Span Text="This is " /> <HyperlinkRangeStart AnnotationID="1"> <HyperlinkInfo NavigateUri="http://www.google.com" /> </HyperlinkRangeStart> <Span StyleNam

我有以下xml

<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>
节点:Span属性:HyperlinkRangeStart注释ID=1和HyperlinkRangeEnd注释ID=1之间的文本是url内容。 HyperlinkRangeStart和HyperlinkRangeEnd上方和下方的跨距文本将是普通文本。 一个段落可以有多达个URL。每个URL范围都有一个唯一的注释ID。 我不知道如何通过属性id匹配不同的xml节点。
非常感谢您的帮助。

这并不是一件小事,所以让我稍微简化一下输入,尽管在我的示例中有两个超链接:

输入:

应用以下样式表:

XSLT1.0

将返回此结果:


格式化超文本链接的问题留给读者作为练习。

不确定xhtml文本是什么意思。请以代码形式发布您的预期结果。同时指出您使用的是XSLT 1.0还是2.0。这是[Google][1]搜索引擎的预期输出。是否希望输出方法为文本?抱歉,已更新问题中的预期输出。好的,然后。任何时候,只要您准备好告诉我们您的XSLT版本就会很方便。
<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>
<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>