XSLT - 输出选择元素并跳过休息

时间:2018-03-23 08:56:16

标签: xml xslt

我是XSLT的新手。我正在尝试使用XSLT将XML转换为CSV。我已经查看了各种可用的在线示例,并试图自己解决这个问题但是我一直在努力获得理想的结果。任何帮助,将不胜感激。

现在的问题陈述。 我有以下XML,我想转换为CSV。这里的问题是我只想从选择节点及其子节点复制数据,而忽略其余的节点。

<Employees>
  <Employee>
    <WorkInfo>
        <Skill>Java</Skill>
        <Experience>10</Experience>
        <PreviousCompany>XYZ</PreviousCompany>
    </workInfo>
    <PersonalInfo>
        <Name>John</Name>
        <LastName> Trevor</LastName>
        <Age>35</Age>
    </PersonalInfo>
  </Employee>
</Employees>

我想在节点 WorkInfo 及其子节点下打印数据,而不打印 PersonalInfo 及其子节点。

我正在使用下面的xslt

 <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:apply-templates select="workInfo"/>
     <xsl:apply-templates select="PersonalInfo"/>
  </xsl:template>

   <xsl:template match="workInfo">
     <xsl:copy-of select="."/>
     <xsl:if test="not(position()=last())">,</xsl:if>
    </xsl:template>

     <xsl:template match="PersonalInfo">
  </xsl:stylesheet>

但是我没有得到预期的输出,这是

Java,10,XYZ

但最终得到一个空洞的结果。请有人帮我理解我哪里出错了。

谢谢, LTL

1 个答案:

答案 0 :(得分:0)

请修改XSL模板,如下所示。您需要循环遍历WorkInfo的所有子元素,并使用<xsl:value-of>输出其值。

<xsl:template match="Employee">
    <xsl:for-each select="WorkInfo/*">
        <xsl:value-of select="." />
        <xsl:if test="position() != last()">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

输出

Java,10,XYZ