XML - 仅使用XSL更改一个元素

时间:2018-01-04 14:48:23

标签: xml xslt

我的XML文件如下所示:



<?xml version="1.0" encoding="UTF-8" ?>
<!-- Diese Grammatik wurde abgelehnt - verwenden Sie stattdessen FMPXMLRESULT. -->
<FMPDSORESULT
	xmlns="http://www.filemaker.com/fmpdsoresult">
	<ERRORCODE>0</ERRORCODE>
	<DATABASE>Test.fmp12</DATABASE>
	<LAYOUT></LAYOUT>
	<ROW MODID="31" RECORDID="1">
		<ID_EXPORT>1</ID_EXPORT>
		<artikel_nr>14368</artikel_nr>
		<sprache>de</sprache>
		<spezifikation>&lt;row&gt;&lt;titel&gt;HDMI Port Auflösung&lt;/titel&gt;&lt;attribbut&gt;3840x2160 (UHD) @ 24/25/30 Hz&lt;/attribbut&gt;&lt;attribbut&gt;2560x1440 (QHD) @ 30/60 Hz&lt;/attribbut&gt;&lt;/row&gt;&lt;row&gt;&lt;titel&gt;Material&lt;/titel&gt;&lt;attribbut&gt;Holz&lt;/attribbut&gt;&lt;attribbut&gt;Stein&lt;/attribbut&gt;&lt;attribbut&gt;Aluminium&lt;/attribbut&gt;&lt;/row&gt;</spezifikation>
	</ROW>
</FMPDSORESULT>
&#13;
&#13;
&#13;

现在我的问题是,我只想更改元素的输出&#34; spezifikation &#34;因为我想像这样禁用输出转义:

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

我找到了这样的例子:

    <xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

但是我无法弄清楚如何为&#34; spezifikation&#34;做出例外?

1 个答案:

答案 0 :(得分:0)

首先从XSLT identity transform

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

然后,您只需添加另一个模板即可匹配spezifikation。但是,您需要考虑在XML中指定了默认命名空间

<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">

如果您使用的是XSLT 1.0,则需要通过命名空间前缀在模板匹配中处理此问题...

<xsl:template match="fm:spezifikation" xmlns:fm="http://www.filemaker.com/fmpdsoresult">

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />

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

  <xsl:template match="fm:spezifikation" xmlns:fm="http://www.filemaker.com/fmpdsoresult">
    <xsl:copy>
      <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

您可以使用xpath-default-namespace来简化XSLT 2.0中的内容。

试试这个XSLT 2.0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
     xpath-default-namespace="http://www.filemaker.com/fmpdsoresult">
  <xsl:output method="xml" indent="yes" />

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

  <xsl:template match="spezifikation">
    <xsl:copy>
      <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>