1

我正在尝试创建 XML 的所有元素的键值对。例子:

<a>
   <b>1</b>
   <c>2</c>
</a>

将返回:

<KEY_VALUE_PAIR>
   <KEY>a/b</KEY>
   <VALUE>1</VALUE>
</KEY_VALUE_PAIR>
<KEY_VALUE_PAIR>
   <KEY>a/c</KEY>
   <VALUE>2</VALUE>
</KEY_VALUE_PAIR>

但是,我的问题是我想将输入 xml 作为字符串。

因此,不要将此作为输入:

<a>
   <b>1</b>
   <c>2</c>
</a>

我想用这个:

<XML>
   <content>&lt;a&gt;&lt;b&gt;xyz&lt;/a&gt;&lt;/b&gt;</content>
</XML>

这是我的代码:它几乎可以工作,创建键值对是可以的,但是它不会在 XML/内容中获取 XML,而是创建输入 xml 的键值对。

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

 <xsl:template match="/XML/content">
  <xsl:value-of select="/XML/content" disable-output-escaping="yes"/>
  <xsl:call-template name="CreateNotificationValues"/>
  <xsl:call-template name="CreateNotificationClear"/>
 </xsl:template>

 <xsl:template match="/" name="CreateNotificationValues">
    <xsl:for-each select="//*[count(child::*) = 0]">
     <KEY_VALUE_PAIR>
      <KEY>
       <xsl:for-each select="ancestor::*"><xsl:value-of select="name()"/>/</xsl:for-each>
       <xsl:value-of select="name()"/>
      </KEY>
      <VALUE>
       <xsl:value-of select="text()"/>
      </VALUE>
     </KEY_VALUE_PAIR>
    </xsl:for-each>
 </xsl:template>

 <xsl:template match="/KEY_VALUE_PAIR" name="CreateNotificationClear">
 </xsl:template>

我该如何使用它:

<xsl:value-of select="/XML/content" disable-output-escaping="yes"/>

作为另一个模板的输入xml?

4

1 回答 1

0

我该如何使用它:

<xsl:value-of select="/XML/content" disable-output-escaping="yes"/> 

作为另一个模板的输入xml?

你不能——可以在格式良好的 XML 文档上执行 XSLT 转换,但上述 XSLT 指令的结果只是一个文本节点(它的最终表示可能看起来像XML,但这是一个一维字符串-- 不是节点树。

为了将字符串用作树(已解析的 XML 文档),您需要……解析此字符串,执行此操作的工具称为xml 解析器

XSLT 1.0 或 XSLT 2.0 转换都不能接受字符串并将其解析为 XML 文档树

在 XSLT 3.0 中可能有一个标准函数parse-xml()可以做到这一点。

在 XSLT 1.0 或 XSLT 2.0 中,有必要调用一个用您喜欢的 PL 编写的扩展函数,它将字符串解析为 XmlDocument 对象并将该对象返回给转换。

于 2012-08-27T12:05:50.487 回答