我想用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。谁能给我一点帮助?
答案 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。