【问题标题】:xsl:value of and apply template to inside elementxsl:value of and apply template to inside element
【发布时间】:2014-02-05 08:03:52
【问题描述】:

如果我有这个怎么办:

<e1>t1<e2>t2</e2></e1>

我想用 XSLT 翻译:

<c1>t1<c2>t2</c2></c1>

我试过了:

<xsl:template match="e1">
  <c1>
     <xsl:value-of select=".">
        <xsl:apply-templates/>
     </xsl:value-of>
  </c1>
</xsl:template>
<xsl:template match="e2">
  <c2>
     <xsl:value-of select="."/>
  </c2>
</xsl:template>

但我收到一个错误,因为 value-of 应该为空。

【问题讨论】:

  • 一个例子不做规则。这就是您将拥有的全部&lt;e1&gt; 父母和&lt;e2&gt; 孩子吗?
  • 看来您使用的是 XSLT 1.0,因为在 2.0 中您会遇到不同的错误。如果您使用的是 XSLT 1.0,请说出来,当您不知道正在使用哪个版本时,很难回答 XSLT 问题。
  • 我,谢谢你的回复,我不知道用xslt 1.0和2.0有区别,反正我用的是1.0。

标签: xml xslt xslt-1.0 value-of


【解决方案1】:

xsl:value-of 必须为空,这是毫无疑问的。但你不需要里面的任何东西。下面的样式表是一个身份转换,有两个例外,即替换 e1e2 的元素名称。

从某种意义上说,它是相当通用的,它替换了任何 XML 文档中的 e1e2,而其余所有内容都保持不变。

样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="e1">
      <c1>
         <xsl:apply-templates select="@*|node()"/>
      </c1>
   </xsl:template>

   <xsl:template match="e2">
      <c2>
         <xsl:apply-templates select="@*|node()"/>
      </c2>
   </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<c1>t1<c2>t2</c2></c1>

【讨论】:

  • 请注意,这两个例外涵盖了给定示例中的所有内容 - 使规则无需处理。
  • 我知道 - 输入 XML 可能只是一个精简的示例,即除了 e1e2 之外可能还有其他内容。
猜你喜欢
  • 1970-01-01
  • 2022-12-26
  • 2023-02-21
  • 2022-12-26
  • 1970-01-01
  • 2022-12-02
  • 2020-05-13
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多