如何分开IDREF并显示其父元素的属性值?

发布于 2025-02-04 19:22:13 字数 2830 浏览 3 评论 0原文

假设我有一个用DTD声明的XML文件,例如:

<?xml version="1.0"  encoding="utf-8"?>
<!DOCTYPE box SYSTEM "box.dtd">
<box>
    <title>My Powerful BOX</title>
    <tape_list>
        <tape tid="tr_1" name="tp_2000"/>
        <tape tid="tr_2" name="tp_20230"/>
        <tape tid="tr_3" name="tp_200412"/>
        <tape tid="tr_4" name="tp_202530341"/>
        <tape tid="tr_5" name="tp_20320"/>
        <tape tid="tr_6" name="tp_202340"/>
        <tape tid="tr_7" name="tp_20253"/>
        <tape tid="tr_8" name="tp_202613"/>
        <tape tid="tr_9" name="tp_20234"/>
        <tape tid="tr_10" name="tp_234000"/>
        <tape tid="tr_11" name="tp_202500"/>
        <tape tid="tr_12" name="tp_201200"/>
    </tape_list>
    <item_list>
        <item item_id="No_1">
            <item_info item_name="MY_item_NAME"/>
            <tapes ref_id="tr_10 tr_11 tr_4"/>
        </item>
        <item item_id="No_2">
            <item_info item_name="MY_item_NAME2"/>
            <tapes ref_id="tr_2"/>
        </item>
    </item_list>
</box>

我正在制作XSL来显示Item_list中的项目表。我想从tape_list/tape/@name中显示item_list/item/tapes名称,但请记住,ref_id type是idref,tid是唯一的ID。类似的内容:

<--Outside of xsl:template-->
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<--------------------------->
                    <table border="1">
                        <xsl:for-each select="box/item_list/item">
                                <tr bgcolor="#9acd32">
                                    <th>title</th>
                                    <th>used tapes</th>
                                </tr>
                                <tr>

                                    <td>
                                        <xsl:value-of select="./item_info/@item_name"/>
                                    </td>
                                    <td>
                                        
                                        <xsl:for-each select="key('tape', tapes/@ref_id)">
                                            <xsl:value-of select="@name"/>
                                        </xsl:for-each>
                                        
                                    </td>
                                </tr>
                        </xsl:for-each>
                    
                    </table>

但是,这仅返回针对项目NO_2的信息,并且对于NO_1返回什么都没有返回。我的问题是为什么会发生这种情况以及如何显示相应ID的名称?

PS:我正在使用XSL版本2.0

Let's say I have a XML file declared with a dtd, for example:

<?xml version="1.0"  encoding="utf-8"?>
<!DOCTYPE box SYSTEM "box.dtd">
<box>
    <title>My Powerful BOX</title>
    <tape_list>
        <tape tid="tr_1" name="tp_2000"/>
        <tape tid="tr_2" name="tp_20230"/>
        <tape tid="tr_3" name="tp_200412"/>
        <tape tid="tr_4" name="tp_202530341"/>
        <tape tid="tr_5" name="tp_20320"/>
        <tape tid="tr_6" name="tp_202340"/>
        <tape tid="tr_7" name="tp_20253"/>
        <tape tid="tr_8" name="tp_202613"/>
        <tape tid="tr_9" name="tp_20234"/>
        <tape tid="tr_10" name="tp_234000"/>
        <tape tid="tr_11" name="tp_202500"/>
        <tape tid="tr_12" name="tp_201200"/>
    </tape_list>
    <item_list>
        <item item_id="No_1">
            <item_info item_name="MY_item_NAME"/>
            <tapes ref_id="tr_10 tr_11 tr_4"/>
        </item>
        <item item_id="No_2">
            <item_info item_name="MY_item_NAME2"/>
            <tapes ref_id="tr_2"/>
        </item>
    </item_list>
</box>

And I'm making a xsl to show a table of items from item_list. I want to show the item_list/item/tapes name from tape_list/tape/@name, but keep in mind that ref_id type is IDREF and tid is unique ID. Something like that:

<--Outside of xsl:template-->
<xsl:key name="tape" match="tape_list/tape" use="@tid"/>
<--------------------------->
                    <table border="1">
                        <xsl:for-each select="box/item_list/item">
                                <tr bgcolor="#9acd32">
                                    <th>title</th>
                                    <th>used tapes</th>
                                </tr>
                                <tr>

                                    <td>
                                        <xsl:value-of select="./item_info/@item_name"/>
                                    </td>
                                    <td>
                                        
                                        <xsl:for-each select="key('tape', tapes/@ref_id)">
                                            <xsl:value-of select="@name"/>
                                        </xsl:for-each>
                                        
                                    </td>
                                </tr>
                        </xsl:for-each>
                    
                    </table>

But this returns info only for item NO_2 and returns nothing for NO_1. My question is why is this happening and how I can show the name for the corresponding id?

P.S: I'm using xsl version 2.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

做个少女永远怀春 2025-02-11 19:22:14

您没有发布预期的结果。我猜您想做以下操作:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="tape" match="tape_list/tape" use="@tid"/>

<xsl:template match="/box">
    <html>
        <body>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <th>title</th>
                    <th>used tapes</th>
                </tr>
                <xsl:for-each select="item_list/item">
                    <tr>
                        <td>
                            <xsl:value-of select="item_info/@item_name"/>
                        </td>
                        <td>
                            <xsl:value-of select="key('tape', tokenize(tapes/@ref_id, ' '))/@name" separator=", "/>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

鉴于您的输入,这将产生:

结果

<!DOCTYPE HTML><html>
   <body>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>title</th>
            <th>used tapes</th>
         </tr>
         <tr>
            <td>MY_item_NAME</td>
            <td>tp_202530341, tp_234000, tp_202500</td>
         </tr>
         <tr>
            <td>MY_item_NAME2</td>
            <td>tp_20230</td>
         </tr>
      </table>
   </body>
</html>

渲染

You did not post the expected result. I am guessing you want to do something like:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="tape" match="tape_list/tape" use="@tid"/>

<xsl:template match="/box">
    <html>
        <body>
            <table border="1">
                <tr bgcolor="#9acd32">
                    <th>title</th>
                    <th>used tapes</th>
                </tr>
                <xsl:for-each select="item_list/item">
                    <tr>
                        <td>
                            <xsl:value-of select="item_info/@item_name"/>
                        </td>
                        <td>
                            <xsl:value-of select="key('tape', tokenize(tapes/@ref_id, ' '))/@name" separator=", "/>
                        </td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

Given your input, this will produce:

Result

<!DOCTYPE HTML><html>
   <body>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>title</th>
            <th>used tapes</th>
         </tr>
         <tr>
            <td>MY_item_NAME</td>
            <td>tp_202530341, tp_234000, tp_202500</td>
         </tr>
         <tr>
            <td>MY_item_NAME2</td>
            <td>tp_20230</td>
         </tr>
      </table>
   </body>
</html>

Rendered

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文