如何根据选择条件将节点集存储在变量中

发布于 2024-10-24 18:36:54 字数 1630 浏览 1 评论 0原文

我有以下 XML 结构

<pages>
    <page id="8992" filename="news7" extension=".aspx" title="News 7"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8991" filename="news6" extension=".aspx" title="News 6"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8990" filename="news5" extension=".aspx" title="News 5"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8883" filename="news2" extension=".aspx" title="News 2"
          real="True" virtual="False" visible="True" day="15" month="2"
          year="2010" />
    <page id="8989" filename="news4" extension=".aspx" title="News 4"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2009" />
</pages>

现在有一个变量,

<xsl:variable name="valid_pages"/>

我想根据以下条件将 /pages/page 存储在变量中

<xsl:variable name="valid_pages">
    <xsl:when test="count(/pages/page) &lt; 2">
        <xsl:value-of select="/pages/page[0]" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="/pages/page[position() &gt; 2]" />
    </xsl:otherwise>
</xsl:variable>

,现在当我使用时

<xsl:value-of select="count($valid_pages)" />

出现错误

在 a 中使用结果树片段 路径表达式,首先将其转换为 使用 msxsl:node-set() 进行节点集 函数

I have following XML structure

<pages>
    <page id="8992" filename="news7" extension=".aspx" title="News 7"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8991" filename="news6" extension=".aspx" title="News 6"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8990" filename="news5" extension=".aspx" title="News 5"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2010" />
    <page id="8883" filename="news2" extension=".aspx" title="News 2"
          real="True" virtual="False" visible="True" day="15" month="2"
          year="2010" />
    <page id="8989" filename="news4" extension=".aspx" title="News 4"
          real="True" virtual="False" visible="True" day="18" month="3"
          year="2009" />
</pages>

Now there is a variable

<xsl:variable name="valid_pages"/>

I want to store /pages/page in a variable based on following conditions

<xsl:variable name="valid_pages">
    <xsl:when test="count(/pages/page) < 2">
        <xsl:value-of select="/pages/page[0]" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="/pages/page[position() > 2]" />
    </xsl:otherwise>
</xsl:variable>

now when I use

<xsl:value-of select="count($valid_pages)" />

I get an error

To use a result tree fragment in a
path expression, first convert it to a
node-set using the msxsl:node-set()
function

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

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

发布评论

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

评论(3

鹤舞 2024-10-31 18:36:54

使用

<xsl:variable name="valid_pages" select=
"/pages/page[not(/pages/page[2])]
|
 /pages/page[position() > 2][/pages/page[2]]
"/>

Use:

<xsl:variable name="valid_pages" select=
"/pages/page[not(/pages/page[2])]
|
 /pages/page[position() > 2][/pages/page[2]]
"/>
み格子的夏天 2024-10-31 18:36:54

首先,这个 position() = 0 是错误的 定义

其次,如果您想要某种以第二个为基准的分区,请使用

<xsl:variable name="valid_pages" 
              select="/pages/page[not(/pages/page[2])] |
                      /pages/page[position() > 2]"/>

注意:如果没有第二个,它就不会是第三个......

First, this position() = 0 is false by definition.

Second, if you want some kind of partition with second as pivot, use

<xsl:variable name="valid_pages" 
              select="/pages/page[not(/pages/page[2])] |
                      /pages/page[position() > 2]"/>

Note: If there is no second, it won't be a third...

南…巷孤猫 2024-10-31 18:36:54

结果树片段(例如 valid_pages 变量)可以通过应用依赖于处理器的函数转换为节点集。像 Saxon9he 这样的 XSLT 2.0 处理器不需要这个,因为在 2.0 RTF 中会自动解释为节点集,但对于您似乎正在使用的 MSXML 6.0 这样的 XSLT 1.0 处理器,以下内容将起作用:

<xsl:value-of select="count(msxsl:node-set($valid_pages))" />

我知道的另一个 RTF 到节点集函数对于 Xalan-J 或 -C,of 是 xalan:nodeset()

不要忘记在样式表根元素中包含名称空间声明:
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xalan="http://xml.apache.org/xalan"

顺便说一句,valid_pages 变量的声明是错误的;根本不考虑重要性和实用性,至少应该写成包含xsl:choose,如下所示:

<xsl:variable name="valid_pages">
    <xsl:choose>
        <xsl:when test="count(/pages/page) < 2">
            <xsl:value-of select="/pages/page[0]" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/pages/page[position() > 2]" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

Result tree fragments like your valid_pages variable can be converted into a node-set by applying a processor-dependent function. XSLT 2.0 processors like Saxon9he will not need this, because in 2.0 RTF's are automatically interpreted as node-sets, but for XSLT 1.0 processors like MSXML 6.0 which you seem to be using, the following will work:

<xsl:value-of select="count(msxsl:node-set($valid_pages))" />

Another RTF to nodeset function that I know of is xalan:nodeset() for Xalan-J or -C.

Don't forget to include the namespace declaration in the stylesheet root element:
xmlns:msxsl="urn:schemas-microsoft-com:xslt" or
xmlns:xalan="http://xml.apache.org/xalan"

By the way the declaration of the valid_pages variable is wrong; not looking at significance and usefulness at all, it should at the least be written including xsl:choose as follows:

<xsl:variable name="valid_pages">
    <xsl:choose>
        <xsl:when test="count(/pages/page) < 2">
            <xsl:value-of select="/pages/page[0]" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/pages/page[position() > 2]" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文