应用XSLT转换时,文本值显示不正确

时间:2017-06-12 09:39:53

标签: xml xslt

给出以下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/>数据。我错过了什么?

3 个答案:

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