我今天有一个非常基本的问题。为什么要赢得所有元素排列的属性?
我想要的输出是
" Last_Name"," First_Name"," DOB" (如果Bene_DOB不存在则使用DOB_DEP)
像这样:
"吉布森""梅尔"" 1965年1月1日"
"诺里斯""夹头"
但我得到了:
"诺里斯""吉布森""夹头""梅尔",
1965年1月1日 12345-01
1965年1月1日
12345-01
我有这个XML
<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/BCBSLA_CR_OFAC_BENE">
<wd:Report_Entry>
<wd:BENE_ALL>
<wd:Last_Name>Norris</wd:Last_Name>
<wd:First_Name>Chuck</wd:First_Name>
<wd:REF_ID>12345-01</wd:REF_ID>
</wd:BENE_ALL>
<wd:Last_Name>Gibson</wd:Last_Name>
<wd:First_Name>Mel</wd:First_Name>
<wd:REF_ID>12345-02</wd:REF_ID>
</wd:BENE_ALL>
<wd:BENE_PEOPLE>
<wd:BENE_DOB>1965-01-02</wd:BENE_DOB>
<wd:Ben_Ref_ID>12345-01</wd:Ben_Ref_ID>
</wd:BENE_PEOPLE>
<wd:BENE_PEOPLE>
<wd:BENE_DOB>1955-01-10</wd:BENE_DOB>
<wd:Ben_Ref_ID>12345-02</wd:Ben_Ref_ID>
</wd:BENE_PEOPLE>
<wd:DEP>
<wd:DOB_Dep>1965-01-01</wd:DOB_Dep>
<wd:Dep_Ref_ID>12345-01</wd:Dep_Ref_ID>
</wd:DEP>
</wd:Report_Entry>
这是我的XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xsl"
xmlns:wd="urn:com.workday.report/BCBSLA_CR_OFAC_BENE"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="wd:BENE_ALL">
<xsl:apply-templates select="wd:EMPLID" mode="csv"/>
<xsl:apply-templates select="wd:Last_Name" mode="csv"/>
<xsl:apply-templates select="wd:First_Name" mode="csv"/>
</xsl:template>
<xsl:template match="wd:BENE_People">
<xsl:apply-templates select="wd:DOB_Bene" mode="csv" />
</xsl:template>
<!--<xsl:choose>
<xsl:when test=
</xsl:choose>-->
<xsl:template match="*" mode="csv">
<xsl:value-of select="concat('"', ., '",')" />
</xsl:template>
<xsl:template match="*" mode="csv-nl">
<xsl:value-of select="concat('"', ., '"
')" />
</xsl:template>
</xsl:stylesheet>
感谢您的帮助!
答案 0 :(得分:1)
如果我正确理解了XML的结构,则需要为以Last_Name
开头的每组元素创建一个新的数据行。在XSLT 2.0中,这可以通过执行以下操作来完成:
<xsl:template match="/Report_Data">
<xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name">
<xsl:value-of select="concat('"', ., '",')" />
<xsl:value-of select="concat('"', current-group()[self::First_Name], '" ')" />
</xsl:for-each-group>
</xsl:template>
返回:
"Norris","Chuck"
"Gibson","Mel"
要添加Bene_DOB
值,您可以使用key,如下所示:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="urn:com.workday.report/BCBSLA_CR_OFAC_BENE">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="person-dob" match="BENE_DOB" use="following-sibling::Ben_Ref_ID[1]" />
<xsl:template match="/Report_Data">
<xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name">
<xsl:value-of select="concat('"', ., '",')" />
<xsl:value-of select="concat('"', current-group()[self::First_Name], '",')" />
<xsl:value-of select="concat('"', key('person-dob', current-group()[self::REF_ID]), '" ')" />
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
演示:http://xsltransform.net/naZXpX2
这是假设密钥以BENE_DOB
,Ben_Ref_ID
。
如果您愿意,可以通过将函数定义为:
来减少代码重复<xsl:function name="my:quote">
<xsl:param name="text"/>
<xsl:sequence select="concat('"', $text, '"')" />
</xsl:function>
然后:
<xsl:template match="/Report_Data">
<xsl:for-each-group select="Report_Entry/BENE_ALL/*" group-starting-with="Last_Name">
<xsl:value-of select="my:quote(.), my:quote(current-group()[self::First_Name]), my:quote(key('person-dob', current-group()[self::REF_ID]))" separator=","/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:template>