我可以在模板匹配= xslt中使用if语句

时间:2014-05-24 00:12:25

标签: xslt

我想要实现三件事。

首先将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>

1 个答案:

答案 0 :(得分:1)

根据您发布的内容,我想出了一些可以帮助您找到解决方案的示例。我假设有些东西,因为你没有发布你的输入源。

重命名 GroupAreaGroupBox(无论他们在您的来源中的哪个位置),您只需要处理GroupAreaGroupBox是:

<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>