我想要实现三件事。
首先将GroupArea重命名为GroupBox节点。
第二个是在GroupBox和GroupArea节点之后放置一个标签。
第三是将所有子GroupArea和GroupBox节点及其内容移动到XML的ParentNode。为了实现这个我使用2模板匹配,这是搞乱的事情。
我暂时无法上传图片以显示此内容。
如果我可以在第一个templateMatch中放置一个If-else逻辑,那么我应该没问题。我想我做不到。但是通过使用其中的2个,第二个templateMatch中的行“xsl:apply-templates select =”node()“将整个节点(包括子GroupArea)复制到GroupArea而不是仅将GroupArea重命名为GroupBox。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--First Template Match. To Move all the child GroupArea and GroupBox to Parent and inject a Blank Controls Tag-->
<xsl:template match="GroupBox|GroupArea">
<xsl:copy>
<xsl:apply-templates select="@*[not(self::GroupBox | self::GroupArea )]" />
<GroupBox>
<Controls>
<xsl:apply-templates select="node()[not(self::GroupBox | self::GroupArea )]" />
</Controls>
</GroupBox>
</xsl:copy>
<xsl:apply-templates select="GroupBox|GroupArea|GROUPAREA|GROUPBOX" />
</xsl:template>
<!--Second Template Match. To Convert all the GroupArea to GroupBox and then Inject the Blank Control Tags-->
<xsl:template match="GroupArea">
<GroupBox>
<xsl:apply-templates select="@*" />
<Controls>
<xsl:apply-templates select="node()" />
</Controls>
</GroupBox>
</xsl:template>
</xsl:stylesheet>
无论如何都要实现同样的目标。下面的XML文件
<MyControls>
<GroupBox Id="GroupBox1" Title="Public Event Details">
<Textbox HasPopup="False" Id="NameOfEvent" Title="Name of Event"> </Textbox>
<GroupBox Id="ctrl_0" Title="">
<CheckBox Title="Public Property" AccessItem="0"></CheckBox>
<Textbox HasPopup="False" Id="Location" Title="Location or Route" ></Textbox>
</GroupBox>
<GroupArea Id="ctrl_1" Title="">
<Textbox Id="_MATaxNumber" Title="MA Tax Number" AccessItem="0" HintText=""></Textbox>
<Textbox HasPopup="False" Id="AttExp" Title="Attes Expected" ></Textbox>
</GroupArea>
<GroupBox Id="ctrl_2" Title=""/>
<GroupBox Id="ctrl_3" Title="">
<CheckBox Id="CBPublicEventDetails_VendingFood" Title="Food" AccessItem="0"></CheckBox>
<CheckBox Id="CBPublicEventDetails_VendingGoods" Title="Goods" AccessItem="0"></CheckBox>
<Textbox HasPopup="False" Id="VendingVendors" Title="Total Vendors" ></Textbox>
</GroupBox>
<GroupArea Id="ctrl_4" Title="">
<CheckBox Id="CBPuEntLiveMusic" Title="Live Music" AccessItem="0"></CheckBox>
<CheckBox Id="CBPubliEntStage" Title="Stage" AccessItem="0"></CheckBox>
</GroupArea>
<GroupBox Id="ctrl_5" Title="">
<CheckBox Id="CBPublicEventDetails_GamesGames" Title="Games" AccessItem="0"></CheckBox>
<CheckBox Id="CBPublicEventDetails_GamesOther" Title="Other" AccessItem="0"></CheckBox>
</GroupBox>
<GroupBox Id="ctrl_6" Title="">
<Textbox HasPopup="False" Id="SecurityHow" Title="How will they be identified?"/>
<Textbox HasPopup="False" Id="SecurityNumber" Title="Security Personnel #"/>
</GroupBox>
<GroupBox Id="ctrl_19" Title="">
<CheckBox Id="cb_pubeventdetails_emswalk" Title="Run/Walk" AccessItem="0"></CheckBox>
<CheckBox Id="cb_pubeventdetails_emsboat" Title="Boating/Swim" AccessItem="0"></CheckBox>
<GroupArea id="gaAdjustmentResults">
<Grid id="gdAdjustmentResults" >
<Columns>
<GridColumn ID="gc1" DataType="Int"></GridColumn>
</Columns>
</Grid>
<GroupArea id="gaAdjustmentNew" >
<Grid id="gdAdjustmentResults" >
<Columns>
<GridColumn ID="gcAdjustment" DataType="Int"></GridColumn>
</Columns>
</Grid>
</GroupArea>
</GroupArea>
</GroupBox>
</GroupBox>
</MyControls>
我用这个XSL输出的是什么。显示有问题的部分。在底部,我已经完成了完整的转换XML。
在使用XML和XSL时,您将看到以下结果,我发现内部GROUPBOX仍未找到。如果您再次进行第二次TEMPLATEMATCH,您将无法找到内部GORUPAREA,但它将是GROUPAREA而不是GROUPBOX
<GroupBox id="gaAdjustmentResults">
<Controls>
<Grid id="gdAdjustmentResults">
<Columns>
<Label ID="gc1" DataType="Int">
</Label>
</Columns>
</Grid>
<GroupBox id="gaAdjustmentNew">
<Controls>
<Grid id="gdAdjustmentResults">
<Columns>
<Label ID="gcAdjustment" DataType="Int">
</Label>
</Columns>
</Grid>
</Controls>
</GroupBox>
</Controls>
如果你看到转变,那么我是否可以移动2个网格节点并将其添加到外部控制标签内的文件底部。
预期产出
<MyControls>
<GroupBox Id="GroupBox1" Title="Public Event Details">
<Controls>
<Textbox HasPopup="False" Id="NameOfEvent" Title="Name of Event">
</Textbox>
</Controls>
</GroupBox>
<GroupBox Id="ctrl_0" Title="">
<Controls>
<CheckBox Title="Public Property" AccessItem="0">
</CheckBox>
<Textbox HasPopup="False" Id="Location" Title="Location or Route">
</Textbox>
</Controls>
</GroupBox>
<GroupBox Id="ctrl_1" Title="">
<Controls>
<Textbox Id="_MATaxNumber" Title="MA Tax Number" AccessItem="0" HintText="">
</Textbox>
<Textbox HasPopup="False" Id="AttExp" Title="Attes Expected">
</Textbox>
</Controls>
</GroupBox>
<GroupBox Id="ctrl_2" Title="">
<Controls>
</Controls>
</GroupBox>
<GroupBox Id="ctrl_3" Title="">
<Controls>
<CheckBox Id="CBPublicEventDetails_VendingFood" Title="Food" AccessItem="0">
</CheckBox>
<CheckBox Id="CBPublicEventDetails_VendingGoods" Title="Goods" AccessItem="0">
</CheckBox>
<Textbox HasPopup="False" Id="VendingVendors" Title="Total Vendors">
</Textbox>
</Controls>
</GroupBox>
...........
...........
<GroupBox id="gaAdjustmentResults">
<Controls>
<Grid id="gdAdjustmentResults">
<Columns>
<Label ID="gc1" DataType="Int">
</Label>
</Columns>
</Grid>
</Controls>
</GroupBox>
<GroupBox id="gaAdjustmentNew">
<Controls>
<Grid id="gdAdjustmentResults">
<Columns>
<Label ID="gcAdjustment" DataType="Int">
</Label>
</Columns>
</Grid>
</Controls>
</GroupBox>
</GroupBox>
</MyControls>
答案 0 :(得分:1)
根据您发布的内容,我想出了一些可以帮助您找到解决方案的示例。我假设有些东西,因为你没有发布你的输入源。
重命名 GroupArea
至GroupBox
(无论他们在您的来源中的哪个位置),您只需要处理GroupArea
或GroupBox
是:
<xsl:template match="GroupArea">
<GroupBox>
<xsl:apply-templates select="@*|node()[not(self::GroupBox | self::GroupArea )]" />
</GroupBox>
</xsl:template>
假设你在某处有一个身份变换:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
后代和属性将被复制到结果树中。
您还需要 <GroupBox>
个节点后的元素。我不明白你想要里面它,所以我把它留空了:
<xsl:template match="GroupArea | GroupBox">
<GroupBox>
<xsl:apply-templates select="@*|node()[not(self::GroupBox | self::GroupArea )]" />
</GroupBox>
<Controls></Controls>
</xsl:template>
现在,要使所有<GroupBox>
个节点成为文档元素的子节点,您只需要匹配文档元素中的模板,然后从那里选择GroupArea | GroupBox
个节点:
<xsl:template match="RootElement">
<xsl:apply-templates select="//GroupBox | //GroupArea" />
...
</xsl:template>
试试这个样式表。如果你的来源结构与我想象的结构没有太大的不同,它至少可以作为一个起点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="RootElement">
<xsl:apply-templates select="//GroupBox | //GroupArea" />
</xsl:template>
<xsl:template match="GroupArea | GroupBox">
<GroupBox>
<xsl:apply-templates select="@*|node()[not(self::GroupBox | self::GroupArea )]" />
</GroupBox>
<Controls></Controls>
<xsl:apply-templates select="node()[self::GroupBox | self::GroupArea]" />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>