使用 xsl 变量捕获为我返回空白的调用模板的输出

发布于 2024-11-15 01:07:48 字数 1328 浏览 0 评论 0原文

我看过很多类似这样的帖子,这让我觉得这是可能的,而我只是做错了事。我已经尽可能地简化了它,试图找出为什么会发生这种情况:

这是我的 xml(没什么令人兴奋的):

<?xml version="1.0" encoding="UTF-8"?>
<REPORT>

</REPORT>

这是我的 xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="REPORT">
      <xsl:variable name="tryThisTemplate">
        <xsl:call-template name="TRY_THIS"/>
      </xsl:variable>
      <TEST1>
        <xsl:call-template name="TRY_THIS"/>
      </TEST1>
      <TEST2>
        <xsl:value-of disable-output-escaping="yes" select="$tryThisTemplate" />
      </TEST2>
      <TEST3>
        <xsl:value-of select="$tryThisTemplate" />
      </TEST3>
    </xsl:template>

    <xsl:template name="TRY_THIS">
      <MY_NODE desc="my description" />
    </xsl:template>
</xsl:stylesheet>

这是我的结果:

<?xml version="1.0" encoding="utf-8"?>  
<TEST1>
  <MY_NODE desc="my description"/>
</TEST1>
<TEST2></TEST2>
<TEST3></TEST3>

这是我的问题: 为什么 TEST2 和 TEST3 不起作用。 $tryThisTemplate 变量似乎为空。我是否误解了什么?我应该以不同的方式做这件事吗?

I have seen lots of posts that do something like this and that makes me feel like this is possible and I am just doing something wrong. I have simplified it as much as possible to try and figure out why this is happening:

Heres my xml (nothing very exciting):

<?xml version="1.0" encoding="UTF-8"?>
<REPORT>

</REPORT>

Here is my xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="REPORT">
      <xsl:variable name="tryThisTemplate">
        <xsl:call-template name="TRY_THIS"/>
      </xsl:variable>
      <TEST1>
        <xsl:call-template name="TRY_THIS"/>
      </TEST1>
      <TEST2>
        <xsl:value-of disable-output-escaping="yes" select="$tryThisTemplate" />
      </TEST2>
      <TEST3>
        <xsl:value-of select="$tryThisTemplate" />
      </TEST3>
    </xsl:template>

    <xsl:template name="TRY_THIS">
      <MY_NODE desc="my description" />
    </xsl:template>
</xsl:stylesheet>

Here is my result:

<?xml version="1.0" encoding="utf-8"?>  
<TEST1>
  <MY_NODE desc="my description"/>
</TEST1>
<TEST2></TEST2>
<TEST3></TEST3>

Here is my question:
How come TEST2 and TEST3 don't work. The $tryThisTemplate variable appears to be blank. Am I misunderstanding something here. Should I be doing this in a different way?

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

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

发布评论

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

评论(4

凉宸 2024-11-22 01:07:48

以下是执行此操作的正确方法(请注意,DOE 不是必需的,应该避免):

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="REPORT">
    <xsl:variable name="tryThisTemplate">
        <xsl:call-template name="TRY_THIS"/>
    </xsl:variable>
    <TEST1>
        <xsl:call-template name="TRY_THIS"/>
    </TEST1>
    <TEST2>
        <xsl:copy-of select="$tryThisTemplate" />
    </TEST2>
    <TEST3>
        <xsl:copy-of select="$tryThisTemplate" />
    </TEST3>
 </xsl:template>

 <xsl:template name="TRY_THIS">
    <MY_NODE desc="my description" />
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<REPORT>

</REPORT>

产生了想要的结果

<TEST1>
   <MY_NODE desc="my description"/>
</TEST1>
<TEST2>
   <MY_NODE desc="my description"/>
</TEST2>
<TEST3>
   <MY_NODE desc="my description"/>
</TEST3>

解释: 复制(正如其名称所示)节点。 输出其 select 属性中的任何内容的字符串值。元素的字符串值是其所有文本节点后代的串联(按文档顺序)。在您的情况下,该元素没有文本节点后代,因此 不输出任何内容。

Here is the correct way to do this (note that DOE is not necessary and should be avoided):

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="REPORT">
    <xsl:variable name="tryThisTemplate">
        <xsl:call-template name="TRY_THIS"/>
    </xsl:variable>
    <TEST1>
        <xsl:call-template name="TRY_THIS"/>
    </TEST1>
    <TEST2>
        <xsl:copy-of select="$tryThisTemplate" />
    </TEST2>
    <TEST3>
        <xsl:copy-of select="$tryThisTemplate" />
    </TEST3>
 </xsl:template>

 <xsl:template name="TRY_THIS">
    <MY_NODE desc="my description" />
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the provided XML document:

<REPORT>

</REPORT>

the wanted result is produced:

<TEST1>
   <MY_NODE desc="my description"/>
</TEST1>
<TEST2>
   <MY_NODE desc="my description"/>
</TEST2>
<TEST3>
   <MY_NODE desc="my description"/>
</TEST3>

Explanation: <xsl:copy-of> copies (as its name says) nodes. <xsl:value-of> outputs the string value of whatever is in its select attribute. The string value of an element is the concatenation (in document order) of all of its text-node descendents. In your case the element has no text-node descendents and thus <xsl:value-of> outputs nothing.

浪菊怪哟 2024-11-22 01:07:48

是的,这里有一个误解。如果您尝试将 $tryThisTemplate 的结构复制到输出,则需要使用 而不是 输出其 select 参数的字符串值,即其文本内容,在本例中为空字符串。

Yes there is a misunderstanding here. If you are trying to copy the structure of $tryThisTemplate to the output, you need to use <xsl:copy-of> instead of <xsl:value-of>. <xsl:value-of> outputs the string value of its select argument, that is, its text content, which in this case is an empty string.

潜移默化 2024-11-22 01:07:48

$tryThisTemplate 变量似乎为空

该变量不是空的,但使用 xsl:value-of 您需要提供其中的文本节点。这就是“空白”。

例如,尝试使用:

  <TEST3>
    <xsl:copy-of select="$tryThisTemplate" />
  </TEST3>

您会看到 MY_NODE 神奇地出现在 TEST3 之间:))

The $tryThisTemplate variable appears to be blank

The variable it's not blank, but with xsl:value-of you are asking for the text nodes inside that. That's "blank".

For instance, try with:

  <TEST3>
    <xsl:copy-of select="$tryThisTemplate" />
  </TEST3>

And you'll see magically appear MY_NODE between TEST3 :))

情何以堪。 2024-11-22 01:07:48

查看我的解决方案

,这是我的模板(是可验证的内容)

<xsl:template name="author-name" match="string-name">
    <xsl:if test="fn[string-length(normalize-space()) > 0] or given-names[string-length(normalize-space()) > 0]">
        <xsl:apply-templates select="fn | given-names" mode="ascii"/>
    </xsl:if>
    <xsl:if test="sn[string-length(normalize-space()) > 0] or surname[string-length(normalize-space()) > 0]">
        <xsl:text> </xsl:text><xsl:apply-templates select="sn | surname" mode="ascii"/>
    </xsl:if>
    <xsl:if test="sn[string-length(normalize-space()) > 0] or suffix[string-length(normalize-space()) > 0]">
        <xsl:text> </xsl:text><xsl:apply-templates select="sn | suffix" mode="ascii"/>
    </xsl:if>
</xsl:template>

,当我在任何其他模板中使用它时,我只是这样称呼它

<xsl:template match="string-name">
    <xsl:variable name="author">
        <xsl:call-template name="author-name"/> <!--here is the tricky part-->
    </xsl:variable>
    <span class="NLM_{name()}">
        <xsl:copy-of select="@id" />
        <xsl:value-of select="normalize-space($author)" />
    </span>   
</xsl:template>

希望这对您有帮助

check out my solution

here is my template (was veriable content)

<xsl:template name="author-name" match="string-name">
    <xsl:if test="fn[string-length(normalize-space()) > 0] or given-names[string-length(normalize-space()) > 0]">
        <xsl:apply-templates select="fn | given-names" mode="ascii"/>
    </xsl:if>
    <xsl:if test="sn[string-length(normalize-space()) > 0] or surname[string-length(normalize-space()) > 0]">
        <xsl:text> </xsl:text><xsl:apply-templates select="sn | surname" mode="ascii"/>
    </xsl:if>
    <xsl:if test="sn[string-length(normalize-space()) > 0] or suffix[string-length(normalize-space()) > 0]">
        <xsl:text> </xsl:text><xsl:apply-templates select="sn | suffix" mode="ascii"/>
    </xsl:if>
</xsl:template>

and when I use it in any other template simply I just call it like this

<xsl:template match="string-name">
    <xsl:variable name="author">
        <xsl:call-template name="author-name"/> <!--here is the tricky part-->
    </xsl:variable>
    <span class="NLM_{name()}">
        <xsl:copy-of select="@id" />
        <xsl:value-of select="normalize-space($author)" />
    </span>   
</xsl:template>

hope this helps you

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