给出以下Xml:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<MessageHeader>
<MessageId>b4794b26-f7fc-438d-bbc2-b30a4fbf5cf9</MessageId>
<CorrelationId>04ce5131-68d9-498a-9d19-02b2a5295537</CorrelationId>
<MessageDateTime>2017-06-06T14:14:58</MessageDateTime>
<BatchId>2a55cd19-ee46-4b59-a94b-2814665aaa82</BatchId>
<MessageSubmissionTypeCode>SomeInfoToGoHere</MessageSubmissionTypeCode>
</MessageHeader>
<Trns>
<RemitKey>0100001002961</RemitKey>
<DATE>01/03/09</DATE>
<ClientNo>00031824</ClientNo>
<POLNOI>00031824*001</POLNOI>
<CurrPolicyStatus>Active</CurrPolicyStatus>
<PolicyProdType>Something</PolicyProdType>
<ClientNameType>Individual</ClientNameType>
<ClientName/>
<IdNumberType>CompanyRegistration</IdNumberType>
<IdNumber/>
<Insurer>Some Insurer</Insurer>
<InsurerNo>00061</InsurerNo>
<AgentCode>0001</AgentCode>
<AgentName>Some Agent</AgentName>
</Trns>
</ROOT>
并给出以下XSL文件:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<TestProcess>
<xsl:apply-templates />
</TestProcess>
</xsl:template>
<xsl:template match="Trns">
<Process>
<Key><xsl:value-of select=".//RemitKey"/></Key>
<Date>
<Submitted><xsl:value-of select=".//DATE"/></Submitted>
</Date>
<Policy>
<PolicyNumber><xsl:value-of select=".//POLNOI"/></PolicyNumber>
<Type><xsl:value-of select=".//PolicyProdType"/></Type>
</Policy>
<Client>
<Type><xsl:value-of select=".//ClientNameType"/></Type>
<Name><xsl:value-of select=".//ClientName"/></Name>
<Identification>
<Type><xsl:value-of select=".//IdNumberType"/></Type>
<Number><xsl:value-of select=".//IdNumber"/></Number>
</Identification>
</Client>
<Insurer>
<Name><xsl:value-of select=".//Insurer"/></Name>
<Code><xsl:value-of select=".//InsurerNo"/></Code>
</Insurer>
</Process>
</xsl:template>
</xsl:stylesheet>
我期待着
的转变<TestProcess>
<Process>
<Key>0100001002961</Key>
<Date>
<Submitted>01/03/09</Submitted>
</Date>
<Policy>
<PolicyNumber>00031824*001</PolicyNumber>
<Type>Something</Type>
</Policy>
<Client>
<Type>Individual</Type>
<Name/>
<Identification>
<Type>CompanyRegistration</Type>
<Number/>
</Identification>
</Client>
<Insurer>
<Name>Some Insurer</Name>
<Code>00061</Code>
</Insurer>
</Process>
</TestProcess>
但是,<MessageHeader/>
标记的文本值插入<TestProcess/>
节点的正下方:
<TestProcess>
b4794b26-f7fc-438d-bbc2-b30a4fbf5cf9
04ce5131-68d9-498a-9d19-02b2a5295537
2017-06-06T14:14:58
2a55cd19-ee46-4b59-a94b-2814665aaa82
SomeInfoToGoHere
<Process>
.
.
.
我想完全排除正在呈现的<MessageHeader/>
数据。我错过了什么?
答案 0 :(得分:0)
首先,我会将<xsl:template match="/">
替换为<xsl:template match="ROOT">
。
然后,对于您的问题,您有两种可能的选择:
选项1
您可以为MessageHeader
创建一个空模板。所以只需将此行添加到您的XSLT文件中:
<xsl:template match="MessageHeader"/>
这意味着当它尝试应用MessageHeader
模板时,它只显示一个空字符串。
选项2
在ROOT
中,只需应用名称不是MessageHeader
的子元素的模板:
<xsl:template match="ROOT">
<TestProcess>
<xsl:apply-templates select="*[not(local-name() = 'MessageHeader')]" />
</TestProcess>
</xsl:template>
答案 1 :(得分:0)
更改此部分:
<xsl:template match="/">
<TestProcess>
<xsl:apply-templates/>
</TestProcess>
</xsl:template>
为:
<xsl:template match="/">
<TestProcess>
<xsl:apply-templates select="ROOT/Trns"/>
</TestProcess>
</xsl:template>
否则,您将模板应用于所有元素,这些元素是/
根节点的子节点(并递归到它们的后代) - 这些元素由built-in template rules处理将文本值复制到输出中。
P.S。使用后代轴是非常低效的,在您的情况下是不必要的(至少在给定的示例中)。而不是:
<xsl:value-of select=".//RemitKey"/>
使用:
<xsl:value-of select="RemitKey"/>
和Trans
的其他元素类似。
答案 2 :(得分:0)
***Run this code***
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<TestProcess>
<xsl:call-template name="ajeet"/>
</TestProcess>
</xsl:template>
<xsl:template name="ajeet" match="Trns">
<Process>
<Key><xsl:value-of select=".//RemitKey"/></Key>
<Date>
<Submitted><xsl:value-of select=".//DATE"/></Submitted>
</Date>
<Policy>
<PolicyNumber><xsl:value-of select=".//POLNOI"/></PolicyNumber>
<Type><xsl:value-of select=".//PolicyProdType"/></Type>
</Policy>
<Client>
<Type><xsl:value-of select=".//ClientNameType"/></Type>
<Name><xsl:value-of select=".//ClientName"/></Name>
<Identification>
<Type><xsl:value-of select=".//IdNumberType"/></Type>
<Number><xsl:value-of select=".//IdNumber"/></Number>
</Identification>
</Client>
<Insurer>
<Name><xsl:value-of select=".//Insurer"/></Name>
<Code><xsl:value-of select=".//InsurerNo"/></Code>
</Insurer>
</Process>
</xsl:template>
</xsl:stylesheet>