【问题标题】:XSLT store xml in an attributeXSLT 将 xml 存储在属性中
【发布时间】:2012-09-21 15:07:07
【问题描述】:

我的 xslt 中有一个看起来像这样的变量。

<xsl:variable name="metadata">
    <Metadata>
        <xsl:apply-templates select="..." />
    </Metadata>
</xsl:variable>

之后,我尝试将元数据 xml 作为 xsl:attribute 添加到另一个节点。我尝试了 value-of,copy-of,但没有成功。使用 copy-of 时,出现以下错误。

<OtherNode>
    <xsl:attribute name="someAttr">
        <!-- I tried these and neither worked -->
        <xsl:value-of select="$metadata" /> <!-- Empty -->
        <xsl:copy-of  select="$metadata" /> <!-- Error -->
    </xsl:attribute>
</OtherNode>

“元素”类型的项目不能在“属性”类型的节点中构造。

这很简单,但出于某种原因,我认为它会自动转义该元素。

顺便说一下,我使用的是 xslt 1.0。

有什么想法吗?

谢谢

【问题讨论】:

标签: xml xslt xslt-1.0


【解决方案1】:

第一次尝试,使用 value-of,应该使用一点 mod(使用 xs:text),但应该至少返回不带 Metadata 元素的 apply-templates 调用的值。您确定 apply-templates select="..." 位实际上是在查找并返回某些内容吗?

这行得通:

<xsl:variable name="metadata">
<xsl:text>&lt;Metadata></xsl:text>
    test
 <xsl:text>&lt;/Metadata></xsl:text>
</xsl:variable>


<xsl:template match="some-element">
  <xsl:element name="some-element">
    <xsl:attribute name="test"><xsl:value-of select="$metadata" /></xsl:attribute>
  </xsl:element>
</xsl:template>

输出如下:

 <some-element test="&lt;Metadata&gt;&#xA;        test&#xA;&lt;/Metadata&gt;">

【讨论】:

  • 是的,这就是我在看到您的答案之前最终所做的事情。我希望我不需要这样做,但是哦,好吧。谢谢!
  • 没有问题,绝对不是一个“酷”的解决方案,但有时只是完成它是最好的。完成它,然后继续进行项目的下一个问题/挑战 :)
【解决方案2】:

似乎您在变量中捕获的不仅仅是文本,而是node()node-set。您需要更改变量以仅选择您要查找的 text()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2011-01-18
    • 2013-06-17
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多