C# XSL转换| XML到XAML |向嵌套元素添加层次结构级别
由于WPF中的GroupBox控件只接受一个WPF控件作为内容,因此我必须首先将所有属性包装到DockPanel控件中 我使用下面的xsl样式表将代码转换为随后显示的XAML代码段 样式表(代码段):C# XSL转换| XML到XAML |向嵌套元素添加层次结构级别,c#,wpf,xaml,xslt,xslt-1.0,C#,Wpf,Xaml,Xslt,Xslt 1.0,由于WPF中的GroupBox控件只接受一个WPF控件作为内容,因此我必须首先将所有属性包装到DockPanel控件中 我使用下面的xsl样式表将代码转换为随后显示的XAML代码段 样式表(代码段): 这是生成的代码XAML: <GroupBox Name="groupbox1" DockPanel.Dock="Left, Right, Top, Bottom" Width="1092" Height="125" Background="Transparent" Foreground=
这是生成的代码XAML:
<GroupBox Name="groupbox1" DockPanel.Dock="Left, Right, Top, Bottom" Width="1092" Height="125" Background="Transparent" Foreground="#0046D5" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False">
<DockPanel Name="panel4" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="lblName" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Name:" />
<TextBox Name="txtName" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel5" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="lblLastName" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Lastname:" />
<TextBox Name="txtLastName" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel6" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="label4" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Age:" />
<TextBox Name="textbox3" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel14" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="label9" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Gender:" />
<RadioButton Name="radiobutton1" DockPanel.Dock="Left" Width="75" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Content="Male" />
<RadioButton Name="radiobutton2" DockPanel.Dock="Left" Width="75" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="2" IsTabStop="True" Content="Female" />
</DockPanel>
</GroupBox>
问题是GroupBox现在包含四个元素,这在WPF中是不可能的。这就是为什么我需要将这些控件包装到一个DockPanel中
当我取消注释
行时,XAML代码如下所示:
<GroupBox> <!-- attributes should appear on this line -->
<DockPanel Name="groupbox1" DockPanel.Dock="Left, Right, Top, Bottom" Width="1092" Height="125" Background="Transparent" Foreground="#0046D5" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False">
<DockPanel Name="panel4" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="lblName" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Name:" />
<TextBox Name="txtName" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel5" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="lblLastName" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Lastname:" />
<TextBox Name="txtLastName" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel6" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="label4" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Age:" />
<TextBox Name="textbox3" DockPanel.Dock="Left" Width="100" Height="25" Background="Azure" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Text="" />
</DockPanel>
<DockPanel Name="panel14" DockPanel.Dock="Top" Width="1078" Height="25" Background="Transparent" Visibility="visible">
<Label Name="label9" DockPanel.Dock="Left" Width="100" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="0" IsTabStop="False" Content="Gender:" />
<RadioButton Name="radiobutton1" DockPanel.Dock="Left" Width="75" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="1" IsTabStop="True" Content="Male" />
<RadioButton Name="radiobutton2" DockPanel.Dock="Left" Width="75" Height="25" Background="Transparent" Foreground="Black" Visibility="visible" BorderThickness="1,1,1,1" FontFamily="Tahoma" FontSize="9" TabIndex="2" IsTabStop="True" Content="Female" />
</DockPanel>
</DockPanel>
</GroupBox>
GroupBox的所有属性都位于嵌套内部GroupBox元素的DockPanel元素中
我需要弄清楚如何创建DockPanel元素(选中)并向上移动到GroupBox元素以调用流程元素模板
有什么想法吗?问题 流程元素模板旨在执行以下操作:
<!-- Map GroupBoxWrapper into GroupBox -->
<xsl:template match="GroupBoxWrapper">
<xsl:element name="GroupBox">
<!-- Process attributes -->
<xsl:apply-templates select="@*|*" mode="to-attr" />
<!-- Create new DockPanel to wrap children -->
<xsl:element name="DockPanel">
<!-- Process GroupBoxWrapper chldren -->
<xsl:apply-templates select="*" />
</xsl:element>
</xsl:element>
</xsl:template>
另外,我认为您应该先了解我们[stackoverflow上的人]发布的代码,然后再实际使用它,这样您就不必在每次出现问题时都依赖于我们。您的输入XML是什么样子的?您想要的输出是什么样子的?将模式
设置为attr
的模板是什么样子的?您不能先创建DockPanel
元素,然后再移动到元素外部添加属性,因此您需要另一种方法,这需要您提供更多信息。不过,只是一个建议,您可以随心所欲地将XML转换为XAML,但在基于XAML的技术中,有一种称为ItemsControl
,如果有合适的数据模板
和数据项
进行绑定,它将替换所有重复的标签+文本框内容。如果这样做的话,我认为XSLT生成的XAML没有它应有的可维护性。@JLRishe“您不能先创建DockPanel元素,然后再移动到它之外添加属性”。他试图实现的是将一些子元素(可以出现在任何位置)转换为其父元素中的属性。如果他同时处理所有内容,他将在这些目标元素之前处理一些元素,并且XSLT不允许在添加子元素之后添加属性。因此,其中一个选项是使用“to attr”模式处理所有这些元素,以便首先处理它们,然后恢复“正常”处理。所以这只是一种排序…@JLRishe。。。以可维护的方式创建元素。(当我说排序时,我指的是“处理订单”,而不是一般排序)
<!-- Map GroupBoxWrapper into GroupBox -->
<xsl:template match="GroupBoxWrapper">
<xsl:element name="GroupBox">
<!-- Process attributes -->
<xsl:apply-templates select="@*|*" mode="to-attr" />
<!-- Create new DockPanel to wrap children -->
<xsl:element name="DockPanel">
<!-- Process GroupBoxWrapper chldren -->
<xsl:apply-templates select="*" />
</xsl:element>
</xsl:element>
</xsl:template>