【问题标题】:xslt: how to remove comma of missing tagxslt:如何删除缺少标签的逗号
【发布时间】:2017-12-25 21:15:56
【问题描述】:

您好,我制作了 xslt,它接收 xml 并以 json 格式输出。 我面临一个问题,如果在 xml 中最后一个标签不存在,它将添加一个逗号并生成无效的 json。所以我需要删除最后一个逗号。

我的 xslt

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">
<xsl:for-each select="Envelope">
{
    <xsl:if test="Enrollment">"Enrollment": 
    [
        <xsl:for-each select="Enrollment">
        {
            <xsl:if test="enrolleeRecords">
            <xsl:for-each select="enrolleeRecords">
            "enrolleeRecords":
            {

                <xsl:if test="employerId">"employerId": "<xsl:value-of select="employerId"/>",</xsl:if>
                <xsl:if test="legalName">"legalName": "<xsl:value-of select="legalName"/>",</xsl:if>
                <xsl:if test="enrolleeList">"enrolleeList":
                [
                    <xsl:for-each select="enrolleeList">
                    {
                        <xsl:if test="refId">"refId": "<xsl:value-of select="refId"/>",</xsl:if>
                        <xsl:if test="enrolleeType">"enrolleeType": "<xsl:value-of select="enrolleeType"/>",</xsl:if>
                        <xsl:if test="employeeId">"employeeId": "<xsl:value-of select="employeeId"/>",</xsl:if>
                        <xsl:if test="personalInfo">
                            <xsl:for-each select="personalInfo">
                            "personalInfo":
                            {
                                <xsl:if test="firstName">"firstName": "<xsl:value-of select="firstName"/>",</xsl:if>
                                <xsl:if test="middleName">"middleName": "<xsl:value-of select="middleName"/>",</xsl:if>
                                <xsl:if test="lastName">"lastName": "<xsl:value-of select="lastName"/>",</xsl:if>
                                <xsl:if test="birthDate">"birthDate": "<xsl:value-of select="birthDate"/>",</xsl:if>
                                <xsl:if test="gender">"gender": "<xsl:value-of select="gender"/>",</xsl:if>
                                <xsl:if test="maritalStatus">"maritalStatus": "<xsl:value-of select="maritalStatus"/>",</xsl:if>
                                <xsl:if test="ssn">"ssn": "<xsl:value-of select="ssn"/>"</xsl:if>
                            },
                            </xsl:for-each>
                        </xsl:if>
                        <xsl:if test="contactDetails">
                        <xsl:for-each select="contactDetails">
                        "contactDetails":
                        {
                            <xsl:if test="enrolleeAddress">
                            <xsl:for-each select="enrolleeAddress">
                            "enrolleeAddress":
                            {
                                <xsl:if test="addressLine1">"addressLine1": "<xsl:value-of select="addressLine1"/>",</xsl:if>
                                <xsl:if test="addressLine2">"addressLine2": "<xsl:value-of select="addressLine2"/>",</xsl:if>
                                <xsl:if test="city">"city": "<xsl:value-of select="city"/>",</xsl:if>
                                <xsl:if test="state">"state": "<xsl:value-of select="state"/>",</xsl:if>
                                <xsl:if test="zip">"zip": "<xsl:value-of select="zip"/>",</xsl:if>
                                <xsl:if test="country">"country": "<xsl:value-of select="country"/>"</xsl:if>
                            }

                            </xsl:for-each>
                            </xsl:if>
                            <xsl:if test="phoneNumber">"phoneNumber": "<xsl:value-of select="phoneNumber"/>",</xsl:if>
                            <xsl:if test="emailAddress">"emailAddress": "<xsl:value-of select="emailAddress"/>"</xsl:if>
                        },
                        </xsl:for-each>
                        </xsl:if>
                    }
                    </xsl:for-each>
                ]</xsl:if>
            }
            </xsl:for-each>
        </xsl:if>
        }
            <xsl:choose>
                <xsl:when test="position() != last()">,</xsl:when>
            </xsl:choose>
        </xsl:for-each>
    ]</xsl:if>
}
    <xsl:choose>
        <xsl:when test="position() != last()">,</xsl:when>
    </xsl:choose>
</xsl:for-each></xsl:template></xsl:stylesheet>

现在的问题是,如果 xml 缺少标签 ssn 或国家/地区,那么 json 输出将变得无效。有没有人可以帮助我解决这个问题。

【问题讨论】:

    标签: json xml xslt


    【解决方案1】:

    只需将逗号移到以下条件中即可更改

                    ....  ,
      <xsl:if test="zip">"zip": "<xsl:value-of select="zip"/>",</xsl:if>
      <xsl:if test="country">"country": "<xsl:value-of select="country"/>"</xsl:if>
    

      <xsl:if test="zip">,"zip": "<xsl:value-of select="zip"/>"</xsl:if>
      <xsl:if test="country">,"country": "<xsl:value-of select="country"/>"</xsl:if>
    

    【讨论】:

    • 但如果邮编和国家/地区都缺失,则条件将保持不变
    • @salman 我的意思是:将所有逗号移到类似的测试中,这样只有在添加以下字段时才添加逗号。
    • @salman 查看编辑:我试图通过显示由相应 xsl:if 保护的 zip 和国家/地区的逗号来更清楚地说明这一点
    • 我已按照您对所有标签的建议进行了这些更改。但是当我的xml输入中缺少personalInfo标签中的firstName时问题仍然存在,然后它在个人信息的开头添加了额外的逗号............
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多