我有这个请求。
<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>