使用 xsl:key 测试前辈兄弟姐妹和匹配后代

发布于 2024-10-21 18:39:35 字数 3107 浏览 1 评论 0原文

我有一个问题,我相信我需要使用 xsl:key 进行分组来解决,但我不知道正确的语法。对于以下 XML,当我处理每个 元素时,我需要测试

  1. 该元素是否具有前导同级 < /code> 元素和具有相同 id 的后代 元素。

  2. 或者该元素具有具有相同 id 的后代 元素和后代 元素。

    • 我所说的“后代”是指在 之前不能有 后代。

对于以下 XML,我希望节点标记为 、和 返回 true。

<root>
    <a><!-- # 0 -->
        <b>
            <c>
                <markerStart id="a1"/>
                <a> <!-- # 1 -->
                    <b>
                        <c>
                        <markeEnd id="a1"/>
                        </c>
                    </b>
                </a>
                <markerStart id="a2"/><!-- # 2a -->
                <markerStart id="a3"/><!-- # 2b -->
                <a><!-- # 2 -->
                    <b>
                        <c>
                        <markeEnd id="a2"/>
                            <a><!-- # 3 -->
                                <b>
                                    <c>
                                        <markeEnd id="a3"/>
                                    </c>
                                </b>
                            </a>
                        </c>
                    </b>
                </a>
                <markerStart id="a5"/>
                <a><!-- # 4 -->
                    <markerStart id="a4"/>
                    <b>
                        <c>
                        <markeEnd id="a4"/>
                        </c>
                    </b>
                </a>
                <a><!-- # 5 -->
                    <b>
                        <c>
                        <markeEnd id="a5"/>
                        </c>
                    </b>
                </a>
            </c>
        </b>
    </a>
</root>

我需要使用 XSL 1.0 来解决这个问题。任何帮助都非常感激。

I have a problem that I believe I need to use grouping using xsl:key to solve, but I am at a loss as to the correct syntax. For the following XML, when I process each <a/> element I need to test to see if

  1. the element has a preceding-sibling <markerStart/> element and a descendant </markerEnd> element with the same id.

    • By "preceding-sibling" I mean that there must not be an <a/> between the current element and the <markerStart/> , so the <a/> marked <!-- # 5 --> should return false, while the <a/> marked <!-- # 1 --> and the first <a/> following the element marked <!-- # 2a --> should return true.
    • By "descendant" I mean that there must not be an <a/> descendant before the <markerEnd/> , so the <a/> marked <!-- # 0 --> and the first <a/> following the element marked <!-- # 2b --> should return false.
  2. OR the element has a descendant <markerStart/> element and a descendant </markerEnd> element with the same id.

    • By "descendant" I mean that there must not be an <a/> descendant before the <markerEnd/>.

For the following XML, I would expect the nodes marked with <!-- # 1 -->, <!-- # 2a -->, and <!-- # 4 --> to return true.

<root>
    <a><!-- # 0 -->
        <b>
            <c>
                <markerStart id="a1"/>
                <a> <!-- # 1 -->
                    <b>
                        <c>
                        <markeEnd id="a1"/>
                        </c>
                    </b>
                </a>
                <markerStart id="a2"/><!-- # 2a -->
                <markerStart id="a3"/><!-- # 2b -->
                <a><!-- # 2 -->
                    <b>
                        <c>
                        <markeEnd id="a2"/>
                            <a><!-- # 3 -->
                                <b>
                                    <c>
                                        <markeEnd id="a3"/>
                                    </c>
                                </b>
                            </a>
                        </c>
                    </b>
                </a>
                <markerStart id="a5"/>
                <a><!-- # 4 -->
                    <markerStart id="a4"/>
                    <b>
                        <c>
                        <markeEnd id="a4"/>
                        </c>
                    </b>
                </a>
                <a><!-- # 5 -->
                    <b>
                        <c>
                        <markeEnd id="a5"/>
                        </c>
                    </b>
                </a>
            </c>
        </b>
    </a>
</root>

I need to used XSL 1.0 for this problem. Any help is more than appreciated.

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

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

发布评论

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

评论(1

苏璃陌 2024-10-28 18:39:35

该样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kMarkerStartByFollowingMarkeEnd"
             match="markerStart"
             use="generate-id(following::markeEnd[1])"/>
    <xsl:key name="kMarkeEndByAncestorA"
             match="markeEnd"
             use="generate-id(ancestor::a[1])"/>
    <xsl:template match="a[key('kMarkeEndByAncestorA',
                               generate-id()
                           )[1]/@id =
                           key('kMarkerStartByFollowingMarkeEnd',
                               generate-id(key('kMarkeEndByAncestorA',
                                               generate-id()
                                           )[1])
                           )/@id]">
        <xsl:copy-of select="comment()"/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

输出:

<!-- # 1 --><!-- # 2 --><!-- # 4 -->

This stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kMarkerStartByFollowingMarkeEnd"
             match="markerStart"
             use="generate-id(following::markeEnd[1])"/>
    <xsl:key name="kMarkeEndByAncestorA"
             match="markeEnd"
             use="generate-id(ancestor::a[1])"/>
    <xsl:template match="a[key('kMarkeEndByAncestorA',
                               generate-id()
                           )[1]/@id =
                           key('kMarkerStartByFollowingMarkeEnd',
                               generate-id(key('kMarkeEndByAncestorA',
                                               generate-id()
                                           )[1])
                           )/@id]">
        <xsl:copy-of select="comment()"/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

Output:

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