当值不存在时创建空白节点

时间:2016-07-06 16:53:12

标签: xml xslt

我正在尝试读取和格式化XML数据。我正在使用XSLT读取数据。我正面临一些问题。有人可以帮我解决这个问题。

我有一个XML输入,其中我只有一个父节点,其余的XML层次结构是一个平面层次结构。

<employee>
    <Name>ABC</Name>
    <Department>IT</Department>
    <Age>30</Age>
    <Salary>40000</Salary>

    <Name>XYZ</Name>
    <Department>IT</Department>
    <Age>25</Age>
    <Salary>30000</Salary>
</employee>

此处Name节点是必需节点,rest是可选节点。我的要求是,如果输入XML中没有任何可选节点,那么我将为它创建一个空白节点。

但代码在以下情况下失败,我没有第一名员工的节点。

<employee>
    <Name>ABC</Name>
    <Department>IT</Department>
    <Age>30</Age>

    <Name>XYZ</Name>
    <Department>IT</Department>
    <Age>25</Age>
    <Salary>30000</Salary>
</employee>

我写的代码是

<xsl:element name="Employee_Information">
    <xsl:for-each select="Name">
        <xsl:variable name="positionVariable">
            <xsl:value-of select="position()"/>
        </xsl:variable>
        <xsl:element name="Employee_Name">
            <xsl:value-of select="."/>
        </xsl:element>
        <xsl:element name="Employee_Dept">
            <xsl:value-of select="../Department[number($positionVariable)]"/>
        </xsl:element>
        <xsl:element name="Employee_Name">
            <xsl:value-of select="../Age[number($positionVariable)]"/>
        </xsl:element>
        <xsl:element name="Employee_Name">
            <xsl:value-of select="../Salary[number($positionVariable)]"/>
        </xsl:element>
    </xsl:for-each>
</xsl:element>

当所有数据都在输入中时,这工作正常,但在上述场景中,它给出的输出如下

<employee>
    <Name>ABC</Name>
    <Department>IT</Department>
    <Age>30</Age>
    <Salary>30000</Salary>
    <Name>XYZ</Name>
    <Department>IT</Department>
    <Age>25</Age>
    <Salary></Salary>
</employee>

为错误的员工创建空白节点。它为第二个员工创建空白节点,其中应为第一个员工创建空白节点。

如果您需要任何其他信息,请与我们联系。 非常感谢你提前。 考希克

1 个答案:

答案 0 :(得分:0)

基本上,这是分组问题。在XSLT 2.0中,使用以下方法解决它将是微不足道的:

<xsl:for-each-group select="*" group-starting-with="Name">

在XSLT 1.0中执行等效操作有点棘手:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="grp" match="Department|Age|Salary" use="generate-id(preceding-sibling::Name[1])" />

<xsl:template match="/employee">
    <Employee_Information>
        <xsl:for-each select="Name">
            <xsl:variable name="current-group" select="key('grp', generate-id())" />
            <Employee_Name>
                <xsl:value-of select="." />
            </Employee_Name>
            <Employee_Dept>
                <xsl:value-of select="$current-group[self::Department]" />
            </Employee_Dept>
            <Employee_Age>
                <xsl:value-of select="$current-group[self::Age]" />
            </Employee_Age>
            <Employee_Salary>
                <xsl:value-of select="$current-group[self::Salary]" />
            </Employee_Salary>
        </xsl:for-each>
    </Employee_Information>
</xsl:template>

</xsl:stylesheet>