0

在使用 XSLT 进行转换时,我无法执行节点内容的编码。我的输入 XML 如下:

  <?xml version="1.0" encoding="iso-8859-1"?>
  <!-- Edited by XMLSpy® -->
  <catalog>
   <cd>
     <title>D-Link</title>
     <artist>Bob Dylan</artist>
     <country>USA</country>
   </cd>
   <cd>
    <title>x-<i>NetGear</i></title>
    <artist>Rod Stewart</artist>
    <country>UK</country>
   </cd>
   <cd>
    <title>LG</title>
    <artist>Andrea Bocelli</artist>
    <country>EU</country>
   </cd>
 </catalog>

XSLT 是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
 exclude-result-prefixes="msxsl">

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

 <xsl:template match="/">
  <Root>
    <xsl:for-each select="catalog/cd">
    <Product>
      <xsl:attribute name="title">          
        <xsl:copy-of select="title/node()"/>          
      </xsl:attribute>
    </Product>
   </xsl:for-each>
  </Root>
 </xsl:template>
</xsl:stylesheet>

目前我收到一个错误:在迭代第二个 CD 标题时,无法在“属性”类型的节点内构造“元素”类型的项目。

预期输出如下:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Product title="D-Link" />
  <Product title="x-&lt;i&gt;NetGear&lt;/i&gt;" />
  <Product title="LG" />
</Root>

有人可以帮我解决上述问题吗?

4

1 回答 1

1

<xsl:copy-of>将尝试其名称所暗示的内容:它将尝试将选定的节点(包括元素)复制到属性中。当然,属性只能包含文本,不能包含元素。

您可以使用专用模板创建“假标签”:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="/">
    <Root>
      <xsl:for-each select="catalog/cd">
        <Product>
          <xsl:attribute name="title">
            <xsl:apply-templates select="title/node()" mode="escape-xml"/>
          </xsl:attribute>
        </Product>
      </xsl:for-each>
    </Root>
  </xsl:template>

  <xsl:template match="*" mode="escape-xml">
    <xsl:value-of select="concat('&lt;',local-name(),'>')"/>
    <xsl:apply-templates select="node()"/>
    <xsl:value-of select="concat('&lt;/',local-name(),'>')"/>
  </xsl:template>
</xsl:stylesheet>

这将提供所需的结果。

于 2013-07-03T15:25:45.610 回答