gpt4 book ai didi

xslt - XSL : xpath not returning the right value

转载 作者:行者123 更新时间:2023-12-04 05:48:41 26 4
gpt4 key购买 nike

我正在用 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值为 @to 的标签每个 labelArc标记。

我在每个属性上都使用领先的命名空间“xlink:”进行了尝试,没有它...

有什么想法吗?

最佳答案

您的代码有两个问题:

首先 :

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

请注意属性值 xlink:to元素 labelArc以字符串 "label_" 开头-- 和 xlink:label loc 的属性不以此字符串开头。

所以你应该写:
    <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>

关于xslt - XSL : xpath not returning the right value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com