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