我做了XSLT转换。
我缺少的是nil属性。我的意思是如果source元素的nil元素为true 我想将它映射到目标XML。
<xsl:if
test="string-length(soapenv:Envelope/soapenv:Body/b:getBLResponse/b:result/BResult:BLOut/Class:ID)=0">
<xsl:attribute name="i:nil">true</xsl:attribute>
</xsl:if>
if if for working for specific node,但我想把它作为通用模板, 不要检查每个字段
可能有可能创建接收xml节点的模板,如果node有nil属性则验证,它将返回nil属性 否则没有nil属性。
以下是示例
使用nil:输入:
<TEST>
<Child i:nil="true">asdf</Child>
</TEST>
Output:
<TEST xmlns:i="whatever" >
<OutputChild i:nil="true">asdf</OutputChild >
</TEST>
Without nil: Input + Output the same
<TEST>
<OutputChild >example</OutputChild >
</TEST>
答案 0 :(得分:0)
我不确定这是否正是您正在寻找的(请记住:始终包含输入和所需的输出XML ),但是这里有一个通用的模板,它看起来是空的应用任何其他处理之前的节点和属性(如果您不需要属性检查,只需删除“或”之后的部分):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="whatever">
<xsl:output method="xml" indent="yes"/>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<xsl:template match="/*">
<xsl:copy>
<xsl:variable name="nil">
<xsl:apply-templates select="." mode="nil"/>
</xsl:variable>
<xsl:if test="$nil='true'">
<xsl:attribute name="i:nil">true</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<xsl:template match="*" mode="nil">
<xsl:choose>
<xsl:when test="string-length(.)=0 or @*[string-length(.)=0]">
<xsl:value-of select="'true'"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="*" mode="nil"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
用nil: 输入:
<TEST>
<Child test="aaa" secondtest="">asdf</Child>
</TEST>
输出:
<TEST xmlns:i="whatever" i:nil="true">
<Child test="aaa" secondtest="">asdf</Child>
</TEST>
没有nil: 输入+输出(什么都不做):
<TEST>
<Child test="aaa" secondtest="bbb">asdf</Child>
</TEST>
答案 1 :(得分:0)
为了解决这个问题,我编写了模板,它接收映射节点和新元素名称。检查元素是否为null后,模板返回nil属性
<xsl:template name="TransformNode" >
<xsl:param name="pCurrentNode"/>
<xsl:param name="elementName"/>
<xsl:element name = "{$elementName}">
<xsl:if test="$pCurrentNode/@i:nil='true'"><xsl:attribute name="nil">true</xsl:attribute></xsl:if>
<xsl:value-of select="$pCurrentNode"/>
</xsl:element>
</xsl:template>