如何在包含xml标签的xslt中操作xml标签及其属性作为其属性?

时间:2015-06-10 05:46:30

标签: xml xslt cdata

我的XML看起来像这样。

<PlayBack>
<![CDATA[<Info Event="WindowActivate" ControlName="" ControlType="" ControlRectSC="" ControlRectCL="" ParentName="" ParentType="" ControlData="" ControlMouseCL="" DialogName="" ExeName=""  MouseButton="" />]]>
</PlayBack>

我想获取Info标签属性值并将它们存储在一些变量中。

预期结果

<xsl:variable name="Event">
      "WindowActivate"    //here i need this value
</xsl:variable>

2 个答案:

答案 0 :(得分:0)

在你给出的例子中,没有Info标签 - 只是一串文本恰好看起来像人眼一样,好像它包含一个信息标签。这就是CData的意思 - 一种存储文本而不将其解释为标签的方式。

如果你想使用它,你需要做2次通过。第一个提取数据并使用xsl将其写入中间文件:value-of( not copy-of - 您需要摆脱CDATA标记)。第二个读取结果,然后可以使用标记。

答案 1 :(得分:0)

您可以从http://saxon.sourceforge.net/下载Saxon 9.6 HE等XSLT 3.0处理器,然后使用XPath 3.0中引入的parse-xml函数:

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

<xsl:template match="PlayBack">
  <xsl:variable name="info" select="parse-xml(.)/Info"/>
  <xsl:variable name="event" select="$info/@Event"/>
  <xsl:value-of select="$event"/>
</xsl:template>

</xsl:stylesheet>

如果你需要使用XSLT 1.0或2.0处理器,那么你需要检查它是否支持或允许你实现类似的扩展功能,如果没有,你需要使用已建议的两步转换解决方案转到新的XML文档(<xsl:template match="PlayBack"><xsl:copy><xsl:value-of select="." disable-output-escaping="yes"/></xsl:copy></xsl:template>),然后使用第二个样式表处理该文件。