Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XSLT中将节点添加到另一个节点_Xml_Xslt - Fatal编程技术网

Xml 在XSLT中将节点添加到另一个节点

Xml 在XSLT中将节点添加到另一个节点,xml,xslt,Xml,Xslt,我有这样的xml: <configurationData> <path name='b'> <path name='a'> <setting name='s1'> ![CDATA[XXXX]] </setting> <setting name='s2'> XXXX </setting>

我有这样的xml:

  <configurationData>
    <path name='b'>
      <path name='a'>
        <setting name='s1'>
        ![CDATA[XXXX]]
        </setting>
        <setting name='s2'>
          XXXX
        </setting>
      </path>
    </path>
  </configurationData>

![CDATA[XXXX]]
XXXX
其中configurationData是根节点,可以有嵌套路径,后跟一个或多个设置节点。我想将设置节点转换为将设置节点的内容放入名为value的子节点

  <configurationData>
    <path name='b'>
      <path name='a'>
        <setting name='s1'>
          <value>![CDATA[XXXX]]</value>
        </setting>
        <setting name='s2'>
          <value>XXXX</value>
        </setting>
      </path>
    </path>
  </configurationData>

![CDATA[XXXX]]
XXXX
我必须承认,我发现XML是一个心理障碍,我看不出要使用什么XSLT:

这是我的尝试:

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

  <xsl:output encoding ="utf-8" indent="yes" method="xml" version="1.0"/>

  <xsl:template match='/setting'>
    <xsl:apply-templates select='setting' />
  </xsl:template>

  <xsl:template match='setting'>
    <value>
      <xsl:value-of select='.'/>
    </value>
  </xsl:template>
</xsl:stylesheet>

你已经完成了90%的任务。您需要的是“身份模板”


第一个模板处理所有节点,将它们复制到输出。但是,更具体地说,“设置”模板会为“设置”节点调用,该模板复制节点本身及其属性,然后将值包装在“值”标记中

XSLT最不重要的一点是样式表不是驱动流程的程序。相反,是输入XML文档进行控制,样式表提供根据输入中的内容选择和执行的指令。这称为“推送”处理。XSL处理器将数据推送到样式表中。XSLT确实具有一些过程性功能,您可以用“拉式”样式编写样式表,其中样式表尝试驱动流程,但这很难,并且导致样式表难以维护

编辑: 要启用CDATA节,请替换:

<xsl:value-of select='.' />

![CDATA[]

(虽然不是最好的解决方案,因为它总是使用CDATA)

我的建议基于Jim Garrison的回答:

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" encoding="utf-8" cdata-section-elements="value" />

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

  <xsl:template match="setting/text()">
    <value>
      <xsl:value-of select="." />
    </value>
  </xsl:template>

</xsl:stylesheet>


+1用于显示您的工作状态。只有一个小问题-CDATA信息是音译的。我需要将CDATA保存为CDATA。只是想一想。我想我可以一直使用CDATA,不是吗?@Preet Sangha:是的,通过声明
CDATA节元素
-查看我的答案。但是,我不在乎它是否是CDATA,因为在“数据级别”上它是等效的。@Jim Garrison:+1。通过特别匹配
设置/text()
,可以在第二个模板中进一步降低复杂性。@吉姆:我需要保留这些信息,因为这些信息既需要手工编辑,也需要机器编辑。音译使得维护数据变得非常困难。但是谢谢你。我将查找cdata部分的内容。谢谢你。你能说明一下为什么这可能更好吗?它不那么复杂,而且更惯用。除此之外,差别不大。
![CDATA[<xsl:value-of select='.' disable-output-escaping="yes"/>]]
<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" encoding="utf-8" cdata-section-elements="value" />

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

  <xsl:template match="setting/text()">
    <value>
      <xsl:value-of select="." />
    </value>
  </xsl:template>

</xsl:stylesheet>