2

我正在用 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:stylesheet version="1.0"
 xmlns:lb="http://www.xbrl.org/2003/linkbase"
 xmlns:xlink="http://www.w3.org/1999/xlink">

    <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>

我期待这个结果:

<TY_T_LABELARC>
   <LOC>de-gaap-ci-2010-12-16.xsd#de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</LOC>
   <FROM>de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</FROM>
   <TO>label_de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</TO>
</TY_T_LABELARC>

LOC我的问题是,除了具有空值(<LOC/>)的元素之外,一切都很好。

这意味着这个 xpath 表达式返回一个空值:

<xsl:value-of select="//lb:loc[@label='$arc_to']/@href"/>

该语句的目标是href从元素中获取属性loc。我可以找到每个标签loc的值对应的标签。@tolabelArc

我在每个属性上都使用前导命名空间“xlink:”尝试了它,没有它......

有任何想法吗?

4

2 回答 2

3

您的代码有两个问题:

首先

    <xsl:variable name="arc_to"       
       select="@xlink:to"/>

请注意,xlink:to元素的属性值labelArc以字符串开头"label_"——而xlink:label属性 ofloc不以该字符串开头。

所以你应该写:

    <xsl:variable name="arc_to"
      select="substring-after(@xlink:to, 'label_')"/>

其次

    <xsl:value-of select="//lb:loc[@xlink:label='$arc_to']/@xlink:href"/>

这与字符串@xlink:label进行比较,而 不是与变量进行比较。 "$arc_to"$arc_to

所以你应该写:

    <xsl:value-of select="//lb:loc[@xlink:label= $arc_to]/@xlink:href"/>

更正后的代码

<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>

当此转换应用于提供的 XML 文档时:

<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 priority="1" xlink:type="arc"
     xlink:from="de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other"
     xlink:to="label_de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other"
     xlink:arcrole="http://www.xbrl.org/2003/arcrole/concept-label" />

            <!-- many <labelArc... elements -->

 </labelLink>
</linkbase>

产生了想要的正确结果:

<TY_T_LABELARC>
   <LOC>de-gaap-ci-2010-12-16.xsd#de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</LOC>
   <FROM>de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</FROM>
   <TO>label_de-gaap-ci_bs.ass.fixAss.fin.otherLoans.other</TO>
</TY_T_LABELARC>
于 2012-04-28T19:35:15.590 回答
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 变量的值。

于 2012-04-28T19:21:34.573 回答