我正在尝试创建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><a><b>xyz</a></b></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?
答案 0 :(得分:0)
我该如何使用:
<xsl:value-of select="/XML/content" disable-output-escaping="yes"/>
作为另一个模板的输入xml?
你不能 - 可以在格式良好的XML文档上执行XSLT转换,但上面的XSLT指令的结果只是一个文本节点(它的最终表示可能是看起来像 XML,但这是一维字符串 - 而不是节点树。
为了将字符串用作树(解析的XML文档),您需要,以及解析此字符串,执行此操作的工具称为 xml解析器< / em>的
XSLT 1.0或XSLT 2.0转换都不能使用字符串并将其解析为XML文档树。
在XSLT 3.0中,可能会有一个标准函数 parse-xml()
,它就是这样做的。
在XSLT 1.0或XSLT 2.0中,必须调用一个用您喜欢的PL编写的扩展函数,它将字符串解析为XmlDocument对象并将该对象返回到转换。 / p>