我的有什么问题吗?

发布于 2024-11-02 08:28:58 字数 440 浏览 0 评论 0原文

我有一个 xsl:param,我试图用它来对属性进行模板匹配。根据我在这里和互联网上找到的所有内容,我的做法是正确的。但是,我的输出是空白的。

这是我的 xslt

<xsl:param name="strm_name">main</xsl:param>    
<xsl:template match="stream[@name='{$strm_name}']"></xsl:template>

如果我将参数调用硬编码为“main”,则效果很好。
这是我试图匹配的 XML 标签..

<doc><stream name="main"></stream></doc>

非常感谢任何帮助!

I have an xsl:param that I'm trying to use to do a template match on an attribute. By everything I've found here and on the Internet, I'm doing this correctly. However, my output is blank.

Here is my xslt

<xsl:param name="strm_name">main</xsl:param>    
<xsl:template match="stream[@name='{$strm_name}']"></xsl:template>

If I hardcode the param call to "main", this works just fine.
Here is the XML tag I'm trying to match to..

<doc><stream name="main"></stream></doc>

Any help is much appreciated!

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

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

发布评论

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

评论(1

诺曦 2024-11-09 08:28:58

我看到两个问题:

  1. 您无法在 XSLT 1.0 的匹配模式中使用变量或参数引用
  2. 在谓词中引用参数时,您不需要周围的 '{...}' 。 (您可能会将其与属性值模板混淆。)请改用:stream[@name=$strm_name]

问题 #1 的一个可能的解决方法是仅选择那些满足条件的元素由你的参数控制。 (您可以在选择表达式中引用参数)。

例如,此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="strm_name" select="'main'"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/*/stream[@name=$strm_name]" />
    </xsl:template>
    <xsl:template match="stream">
        <xsl:apply-templates />
        <xsl:text>/</xsl:text>
    </xsl:template>
</xsl:stylesheet>

应用到此文档:

<root>
    <stream name="main">1</stream>
    <stream name="other">2</stream>
    <stream name="main">3</stream>
    <stream name="main">4</stream>
    <stream name="other">5</stream>
    <stream name="other">6</stream>
</root>

...仅匹配所需的节点。输出:

1/3/4/

I see two issues:

  1. You cannot use a variable or parameter reference in a match pattern in XSLT 1.0
  2. You do not need the surrounding '{...}' when referencing your parameter in the predicate. (You're probably confusing this with an Attribute Value Template.) Use this instead: stream[@name=$strm_name]

A possible workaround for issue #1 is to select only those elements that meet the criteria controlled by your param. (You can reference a param in a select expression).

For example, this stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:param name="strm_name" select="'main'"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/*/stream[@name=$strm_name]" />
    </xsl:template>
    <xsl:template match="stream">
        <xsl:apply-templates />
        <xsl:text>/</xsl:text>
    </xsl:template>
</xsl:stylesheet>

Applied to this document:

<root>
    <stream name="main">1</stream>
    <stream name="other">2</stream>
    <stream name="main">3</stream>
    <stream name="main">4</stream>
    <stream name="other">5</stream>
    <stream name="other">6</stream>
</root>

...matches only the desired nodes. Output:

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