使用一些默认值更新空元素

update the empty elements with some default value

我有这个请求。

<request>
  <event>
    <st1>ky</st1>
    <st2>de</st2>
    <st3></st3>
    <st4></st4>
    <st5></st5>
    <ty>
      <st_in>
        <stno>1</stno>
        <stid></stid>
      </st_in>
    </ty>
    <mt_in>
      <mt_mem>
        <mt_id></mt_id>
        <mt_1></mt_1>
      </mt_mem>
    </mt_in>
  </event>
</request>

如果有空我想将它更新为一些默认值 NO 除了元素 ty 和 mt_in。

所以输出将是

<request>
  <event>
    <st1>ky</st1>
    <st2>de</st2>
    <st3>NO</st3>
    <st4>NO</st4>
    <st5>NO</st5>
    <ty>
      <st_in>
        <stno>1</stno>
        <stid></stid>
      </st_in>
    </ty>
    <mt_in>
      <mt_mem>
        <mt_id></mt_id>
        <mt_1></mt_1>
      </mt_mem>
    </mt_in>
  </event>
</request>

我有这个样式表,但它只给出了根元素

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="*[not(self::ty|self::mt_in)]">
 <xsl:if test="*[normalize-space(string(.)) = '']">
  <xsl:element name="{name()}" namespace="{namespace-uri()}"><xsl:value-of select="'NO'"/></xsl:element>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

那么如何更新我的回复。

如果您制作第二个模板:

<xsl:template match="*[not (node() or self::ty or self::mt_in)]">
     <xsl:copy>
          <xsl:value-of select="'NO'"/>
     </xsl:copy>
</xsl:template>

您将得到以下结果:

<?xml version="1.0" encoding="UTF-8"?>
<request>
   <event>
      <st1>ky</st1>
      <st2>de</st2>
      <st3>NO</st3>
      <st4>NO</st4>
      <st5>NO</st5>
      <ty>
         <st_in>
            <stno>1</stno>
            <stid>NO</stid>
         </st_in>
      </ty>
      <mt_in>
         <mt_mem>
            <mt_id>NO</mt_id>
            <mt_1>NO</mt_1>
         </mt_mem>
      </mt_in>
   </event>
</request>

这符合您设定的目标:

If there is empty I want to update it to some default value of NO except for elements ty and mt_in.

但是,它符合您预期的输出,这显然遵循了一些不同的逻辑。也许你的意思是:

<xsl:template match="*[not (node() or ancestor::ty or ancestor::mt_in)]">
     <xsl:copy>
          <xsl:value-of select="'NO'"/>
     </xsl:copy>
</xsl:template>

这个变换:

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

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

  <xsl:template match=
  "event/*[not(ancestor-or-self::*[self::ty or self::mt_in]) and not(node())]">
    <xsl:copy>NO</xsl:copy>
  </xsl:template>
</xsl:stylesheet>

应用于提供的源 XML 文档时:

<request>
    <event>
        <st1>ky</st1>
        <st2>de</st2>
        <st3></st3>
        <st4></st4>
        <st5></st5>
        <ty>
            <st_in>
                <stno>1</stno>
                <stid></stid>
            </st_in>
        </ty>
        <mt_in>
            <mt_mem>
                <mt_id></mt_id>
                <mt_1></mt_1>
            </mt_mem>
        </mt_in>
    </event>
</request>

产生想要的正确结果:

<request>
      <event>
            <st1>ky</st1>
            <st2>de</st2>
            <st3>NO</st3>
            <st4>NO</st4>
            <st5>NO</st5>
            <ty>
                  <st_in>
                        <stno>1</stno>
                        <stid/>
                  </st_in>
            </ty>
            <mt_in>
                  <mt_mem>
                        <mt_id/>
                        <mt_1/>
                  </mt_mem>
            </mt_in>
      </event>
</request>