Java 需要使用XSLT从XML在平面文件中自定义顺序

Java 需要使用XSLT从XML在平面文件中自定义顺序,java,xslt,flat-file,xalan,edi,Java,Xslt,Flat File,Xalan,Edi,我想使用xslt从xml创建一个平面文件,输出顺序如下所示: <xsl:template match="Claim/Claimant"> <xsl:apply-templates /> <xsl:text>NM1*CC*1*</xsl:text> <xsl:value-of select="@lastName" /> <xsl:text>*</xsl:text> <x

我想使用xslt从xml创建一个平面文件,输出顺序如下所示:

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
NM1*CC*1*史密斯*约翰****34*9999999~
N3*100主街~

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
从这个XML:

<Claim>
 <Claimant
    lastName="Smith"
    firstName="John"
    middleName=""
    suffixName=""
    indentificationCodeQualifier="34"
    identificationCode="999999999">
    <ClaimantStreetLocation
        primary="100 Main Street"
        secondary=""/>
 </Claimant>
</Claim>
<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`

使用我创建的XSLT,由于XSLT在遍历输入树时的工作性质,我以与预期相反的顺序获得输出,如下所示:

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
N3*100主街~
NM1*CC*1*史密斯*约翰****34*9999999~

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
我需要更改/添加什么才能获得我所编写的XSLT的顺序,如图所示: `

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`

NM1*CC*1*
*
*
*
*
*
*
~
N3*
~
`
有没有一种方法可以在不将两个标签合并为一个标签的情况下实现这一点

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
如有任何反馈,将不胜感激

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`

我不知道这是否重要,但我正在使用xalan java在代码中处理xslt。

如果要先处理父级,再处理子级,则应将应用模板移到父级模板的末尾:

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
<xsl:template match="Claim/Claimant">
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`

NM1*CC*1*
*
*
*
*
*
*
~
N3*
~
`
更新:这里发生的是:

<xsl:template match="Claim/Claimant">
    <xsl:apply-templates />
    <xsl:text>NM1*CC*1*</xsl:text>
    <xsl:value-of select="@lastName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@firstName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@middleName" />
    <xsl:text>*</xsl:text>
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@suffixName" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@indentificationCodeQualifier" />
    <xsl:text>*</xsl:text>
    <xsl:value-of select="@identificationCode" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>

<xsl:template match="Claim/Claimant/ClaimantStreetLocation">
    <xsl:apply-templates />
    <xsl:text>N3*</xsl:text>
    <xsl:value-of select="@primary" />
    <xsl:text>~</xsl:text>
    <xsl:text>
    </xsl:text>
</xsl:template>`
  • 处理的第一个元素是Claim,但没有与之匹配的模板,因此将应用默认模板,该模板将处理其子节点的模板

  • <xsl:template match="Claim/Claimant">
        <xsl:apply-templates />
        <xsl:text>NM1*CC*1*</xsl:text>
        <xsl:value-of select="@lastName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@firstName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@middleName" />
        <xsl:text>*</xsl:text>
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@suffixName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@indentificationCodeQualifier" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@identificationCode" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>
    
    <xsl:template match="Claim/Claimant/ClaimantStreetLocation">
        <xsl:apply-templates />
        <xsl:text>N3*</xsl:text>
        <xsl:value-of select="@primary" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>`
    
  • 在这里,第一个孩子是索赔人,你有一个匹配它的模板,所以它被应用了

  • <xsl:template match="Claim/Claimant">
        <xsl:apply-templates />
        <xsl:text>NM1*CC*1*</xsl:text>
        <xsl:value-of select="@lastName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@firstName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@middleName" />
        <xsl:text>*</xsl:text>
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@suffixName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@indentificationCodeQualifier" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@identificationCode" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>
    
    <xsl:template match="Claim/Claimant/ClaimantStreetLocation">
        <xsl:apply-templates />
        <xsl:text>N3*</xsl:text>
        <xsl:value-of select="@primary" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>`
    
  • 接下来,按顺序处理该模板。但关键点是应用模板在其默认选择中忽略了属性(请参见 ),因此唯一匹配的节点是ClaimentStreetLocation元素

  • <xsl:template match="Claim/Claimant">
        <xsl:apply-templates />
        <xsl:text>NM1*CC*1*</xsl:text>
        <xsl:value-of select="@lastName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@firstName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@middleName" />
        <xsl:text>*</xsl:text>
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@suffixName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@indentificationCodeQualifier" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@identificationCode" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>
    
    <xsl:template match="Claim/Claimant/ClaimantStreetLocation">
        <xsl:apply-templates />
        <xsl:text>N3*</xsl:text>
        <xsl:value-of select="@primary" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>`
    
  • 假设您有一个与ClaimentStreetLocation匹配的模板,则会应用该模板。因此,如果要首先处理属性,则应延迟应用模板,直到手动选择它们

  • <xsl:template match="Claim/Claimant">
        <xsl:apply-templates />
        <xsl:text>NM1*CC*1*</xsl:text>
        <xsl:value-of select="@lastName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@firstName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@middleName" />
        <xsl:text>*</xsl:text>
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@suffixName" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@indentificationCodeQualifier" />
        <xsl:text>*</xsl:text>
        <xsl:value-of select="@identificationCode" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>
    
    <xsl:template match="Claim/Claimant/ClaimantStreetLocation">
        <xsl:apply-templates />
        <xsl:text>N3*</xsl:text>
        <xsl:value-of select="@primary" />
        <xsl:text>~</xsl:text>
        <xsl:text>
        </xsl:text>
    </xsl:template>`
    

    谢谢你,史林!成功了。但是,如何将移动到父级的底部导致父级首先运行呢。如果我需要在ClaimentStreetLocation模板后面添加新行,是否应该命名这些标签?在回答中添加了解释。希望能有帮助,这是有道理的。谢谢你的解释!