使用XSLT转换XML结构

时间:2015-06-19 14:30:30

标签: xml xslt xpath

我想用XSLT转换XML结构。

 <detaileddescription>
   <para>Some text</para>
   <List>
    <Title>Title</Title>
    <Intro>
      Intro text:
    </Intro
    <ListItem>
      <para>Text</para>
     </ListItem>
     <ListItem>
      <para>Text</para>
     </ListItem>
    </List>
 </detaileddescription>

这就是我想要的:

<bold>

所以用我自己的话说: 如果<para>中有<para>,请检查<para>的以下兄弟是否也是<para>Text</para>并且有一个孩子Declare @lastnamedup varchar(1) = 'N', @firstnamedup varchar(1) = 'N', @DOBdup varchar(1) = 'N', @SSNdup = 'N', @ZIPdup= 'N' /*UI values passed could set any to Y*/ select p.id p.lastname, p.firstname, p.SSN, p.DOB, p.Address1, p.Address2, p.zip p.phone from person p join person p2 on p.id <> p2id and /* conditionally join based on Dup flags activated could be 1 or many of any of the 5 dup variables for example @lastnamedup = 'Y' include and p.lastname = p2.lastname*/ 比我想要的如图所示重建结构。

我不确定是否可能,因为我刚开始使用xslt / xpath。谁能给我一点帮助?

1 个答案:

答案 0 :(得分:1)

如果你想在节点上使用条件,那么我建议将它们放入匹配模式中:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="detaileddescription/para[bold][following-sibling::*[1][self::para[.//para]]]">
       <List>
           <Title>
               <xsl:value-of select="bold"/>
           </Title>
           <xsl:apply-templates select="following-sibling::*[1]"  mode="intro-list"/>
       </List>
    </xsl:template>

    <xsl:template match="detaileddescription/para[.//para][preceding-sibling::*[1][self::para[bold]]]"/>

    <xsl:template match="detaileddescription/para/text()[1]" mode="intro-list">
        <Intro>
            <xsl:value-of select="."/>
        </Intro>
    </xsl:template>

    <xsl:template match="listitem" mode="intro-list">
        <ListItem>
            <xsl:apply-templates/>
        </ListItem>
    </xsl:template>
</xsl:transform>

有关示例,请参阅http://xsltransform.net/3NzcBtK/2