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



我有这个请求。

<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>

如果有空,我想将其更新为除元素ty和mt_in之外的一些默认值NO。

所以输出将是

<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>

这符合您的既定目标:

如果有空,我想将其更新为默认值NO除了元素ty和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>

最新更新