我的 XML 源在linkGrp
. 基于@target 属性指定的那些交叉引用,我需要对s
元素的值进行分组。如果目标属性包含一对一的引用,我的代码如下:
<DIV>
<div id="e">
<s id="e1">AAAAA</s>
<s id="e2">BBBBB</s>
<s id="e3">CCCCC</s>
</div>
<div id="fr">
<s id="fr1">DDDDD</s>
<s id="fr2">EEEEE</s>
<s id="fr3">FFFFF</s>
</div>
<linkGrp type="alignment" domains="e fr">
<link target="#e1 #fr1"/>
<link target="#e2 #fr3"/>
<link target="#e3 #fr2"/>
</linkGrp>
</DIV>
我得到的请求的 HTML 输出是这样的:
*AAAAA
DDDDD
*BBBBB
FFFFF
*CCCCC
EEEEE
为了得到这个结果,我使用了下面的 XSLT 代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="linkId" match="s" use="@id"/>
<xsl:template match="/DIV">
<html>
<head>
<title>Test</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="link">
<ul>
<li>
<xsl:value-of select="key('linkId',substring-before(substring-after(@target, '#'), ' '))"/>
<br/>
<xsl:value-of select="key('linkId',substring-after(@target, ' #'))"/>
</li>
</ul>
</xsl:template>
<xsl:template match="div"/>
<xsl:template match="s"/>
<xsl:template match="*">
<xsl:message terminate="no">
WARNING: Unmatched element: <xsl:value-of select="name()"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
但是,当我为元素中的一个 @target 添加更多交叉引用时,我的 XSLT 代码无法正常工作,link
如下所示:
<DIV>
<div id="e">
<s id="e1">AAAAA</s>
<s id="e2">BBBBB</s>
<s id="e3">CCCCC</s>
</div>
<div id="fr">
<s id="fr1">DDDDD</s>
<s id="fr2">EEEEE</s>
<s id="fr3">FFFFF</s>
</div>
<linkGrp type="alignment" domains="e fr">
<link target="#e1 #fr1"/>
<link target="#e2 #fr3 #fr1 #fr2"/>
<link target="#e3 #fr2 #fr3"/>
</linkGrp>
</DIV>
由于 XML 源代码中有多个交叉引用,我的 XSLT 代码无法获取任何匹配项。我需要我的代码来检索@target
属性中指定的所有匹配项。谁能指出我的 XSLT 代码中的错误或提供替代解决方案?