我正在尝试读取和格式化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>
为错误的员工创建空白节点。它为第二个员工创建空白节点,其中应为第一个员工创建空白节点。
如果您需要任何其他信息,请与我们联系。 非常感谢你提前。 考希克
答案 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>