Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSL转换| XML到XAML |向嵌套元素添加层次结构级别_C#_Wpf_Xaml_Xslt_Xslt 1.0 - Fatal编程技术网

C# XSL转换| XML到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=

由于WPF中的GroupBox控件只接受一个WPF控件作为内容,因此我必须首先将所有属性包装到DockPanel控件中

我使用下面的xsl样式表将代码转换为随后显示的XAML代码段 样式表(代码段):


这是生成的代码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元素以调用流程元素模板


有什么想法吗?

问题

流程元素模板旨在执行以下操作:

  • 将当前属性和当前元素的子元素转换为新元素的属性
  • 使用attr参数添加额外属性
  • 正常处理孩子
  • 当前出现的问题是因为您正在将步骤1()中的属性附加到新创建的元素DockPanel()中。这就是在其他元素中复制属性的原因

    解决方案

    不要依赖模板流程元素来完成此转换。最初,该模板是在某个点()上的所有元素都遵循不同的逻辑以保存重复代码时编写的。因此,如果您试图实现的内容没有遵循前面的模式,则必须修改流程模板或为GroupBoxWrapper元素编写不同的模板

    以下模板将修复您试图实现的目标

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