XSL:动态选择节点

时间:2012-04-28 19:13:43

标签: xslt abap

我正在使用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:”并且没有它...

有什么想法吗?

2 个答案:

答案 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变量的值。

相关问题