我正在使用XSL解析XSL文件。我在动态查找节点时遇到问题。这是场景:
<linkbase xmlns="http://www.xbrl.org/2003/linkbase" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd">
<labelLink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:role="http://www.xbrl.org/2003/role/link" xlink:type="extended">
<loc xlink:type="locator" xlink:href="de-gaap-ci-2010-12-16.xsd#de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other" xlink:label="de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other"/>
<!-- many <loc... elements -->
<labelArc xlink:from="de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other" xlink:to="label_de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other" priority="1" xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" xlink:type="arc"/>
<!-- many <labelArc... elements -->
</labelLink>
</linkbase>
我正在解析labelArc
元素,并希望包含来自loc
元素的信息。这是通过SAP / ABAP ...
我的XSL代码如下所示:
<xsl:template match="lb:labelArc">
<xsl:variable name="arc_to" select="@xlink:to"/>
<TY_T_LABELARC>
<LOC> <xsl:value-of select="//lb:loc[@xlink:label='$arc_to']/@xlink:href"/> </LOC>
<FROM> <xsl:value-of select="@xlink:from"/> </FROM>
<TO> <xsl:value-of select="@xlink:to"/> </TO>
<!-- Other values follow -->
</TY_T_LABELARC>
</xsl:template>
我想将@href
标记中的loc
包含到输出中。我可以找到相应的loc
代码,其中每个@to
代码的值为labelArc
。
我的问题是这个语句返回一个空值:
<xsl:value-of select="//lb:loc[@label='$arc_to']/@href"/>
我在每个属性上都使用了前导名称空间“xlink:”并且没有它...
有什么想法吗?
答案 0 :(得分:2)
您的代码存在两个问题:
<强>首先强>:
<xsl:variable name="arc_to"
select="@xlink:to"/>
请注意,xlink:to
的{{1}}的值以字符串labelArc
开头 - 而"label_"
的{{1}}属性无法启动用这个字符串。
<强>其次强>:
xlink:label
将loc
与字符串 <xsl:value-of select="//lb:loc[@xlink:label='$arc_to']/@xlink:href"/>
进行比较,而不是变量@xlink:label
。
更正后的代码:
"$arc_to"
将此转换应用于提供的XML文档:
$arc_to
产生了想要的正确结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:lb="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://www.w3.org/1999/xlink"
exclude-result-prefixes="lb xlink">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="lb:labelArc">
<xsl:variable name="arc_to"
select="substring-after(@xlink:to, 'label_')"/>
<TY_T_LABELARC>
<LOC> <xsl:value-of select="//lb:loc[@xlink:label= $arc_to]/@xlink:href"/> </LOC>
<FROM> <xsl:value-of select="@xlink:from"/> </FROM>
<TO> <xsl:value-of select="@xlink:to"/> </TO>
<!-- Other values follow -->
</TY_T_LABELARC>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
尝试:
<xsl:value-of select="//lb:loc[@label=$arc_to]/@href"/>
如果你写
<xsl:value-of select="//lb:loc[@label='$arc_to']/@href"/>
然后你告诉XSL处理器匹配字符串'$ arc_to'而不是arc_to变量的值。