0

这是编写此 xslt 的正确方法吗?首先是我要转换的 XML 片段,其次是我正在编写的 xslt,最后是结果:

<ysl:TableNodeStyle TableRenderingOrder="RowsFirst"> 
      <ysl:TableNodeStyle.Table> 
        <y:Table Insets="30,0,0,0" RelativeLocation="0,0"> 
          <y:Table.Rows

> 
                <y:Row MinimumSize="10" Size="185.389513343799" Insets="30,0,0,0" Style="{y:GraphMLReference 2}"> 
                  <y:Row.Labels> 
                    <y:Label LabelModelParameter="{x:Static ysl:StretchStripeLabelModel.West}" Style="{y:GraphMLReference 1}" PreferredSize="72,15"> 
                      <y:Label.Text>Development</y:Label.Text> 
                    </y:Label> 
                  </y:Row.Labels> 
                </y:Row>

下一个

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:ysl="http://www.yworks.com/xml/yfiles-for-silverlight/1.0/xaml" 
> 
  <xsl:output method="xml" indent="yes"/> 

  <xsl:template match="/"> 

    <xsl:element name="graphml"> 
      <xsl:element name="graph"> 
        <xsl:element name="TableNodeStyle"> 
          <xsl:attribute name="TableRenderingOrder"><xsl:value-of select="TableRenderingOrder"/></xsl:attribute> 

          <xsl:element name="TableNodeStyle.Table"> 
            <xsl:element name="Table"> 
            <xsl:attribute name="Table"><xsl:value-of select="Table"/></xsl:attribute> 
              <xsl:element name="Table.Rows"> 
                <xsl:element name="Row"> 
                  <xsl:attribute name="Row"><xsl:value-of select="Row"/></xsl:attribute> 
                  <xsl:element name="Label"> 
                    <xsl:attribute name="Label"><xsl:value-of select="Label"/></xsl:attribute> 
                  <!--<y:Row.Labels> 
                    <y:Label LabelModelParameter="{x:Static ysl:StretchStripeLabelModel.West}" Style="{y:GraphMLReference 1}" PreferredSize="72,15"> 
                      <y:Label.Text>Development</y:Label.Text>--> 
                  </xsl:element> 
                </xsl:element> 
              </xsl:element> 
            </xsl:element> 
          </xsl:element> 
        </xsl:element> 
      </xsl:element> 
    </xsl:element> 
  </xsl:template> 
</xsl:stylesheet>

最后,

    <?xml version="1.0" encoding="utf-8"?> 
<graphml> 
  <graph> 
    <TableNodeStyle TableRenderingOrder=""> 
      <TableNodeStyle.Table> 
        <Table Table=""> 
          <Table.Rows> 
            <Row Row=""> 
              <Label Label="" /> 
            </Row> 
          </Table.Rows> 
        </Table> 
      </TableNodeStyle.Table> 
    </TableNodeStyle> 
  </graph> 
</graphml>

这显然没有按预期工作,我不确定我做错了什么。非常感激任何的帮助。

4

1 回答 1

0

样式表有几个问题。以 TableNodeStyle 输出元素为例,您的上下文节点<xsl:value-of>是文档的根。您可以在样式表中创建一个新模板以匹配<ysl:TableNodeStyle>输入文档中的元素:

<xsl:template match="TableNodeStyle">
    <xsl:element name="TableNodeStyle">
        <xsl:attribute name="TableRenderingOrder"><xsl:value-of select="@TableRenderingOrder"/></xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

在这里,您有一个与源 XML 中的 TableNodeStyle 元素匹配的模板,并且可以应用于<xsl:apply-templates/>

<xsl:template match="/">
    <xsl:element name="graphml">
        <xsl:element name="graph">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:element>
</xsl:template>

其次,你<xsl:value-of select="TableRenderingOrder"/>应该是<xsl:value-of select="@TableRenderingOrder"/>- 你需要 @ 来指定你正在寻找"@TableRenderingOrder".

然后,您可以为每个子元素创建一个模板并调用它们,可以通过 element 或通过<xsl:call-templates/>.

通过查看您的原始样式表,我认为在网络上找到一些简单的示例并在回到这个问题之前运行这些示例对您非常有用。应该有足够的内容让您可以了解更多关于您在这里尝试做的事情。

更新:好的,我已经为你创建了一个可能对你有用的样式表——它做了我认为你正在尝试做的事情,对你来说可能是一个很好的起点,但我真的建议找出它是如何工作的,而不是只是复制并希望:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:ysl="http://www.yworks.com/xml/yfiles-for-silverlight/1.0/xaml">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Label">
        <xsl:element name="Label">
            <xsl:attribute name="LabelModelParameter"><xsl:value-of select="@LabelModelParameter"/></xsl:attribute>
            <xsl:attribute name="Style"><xsl:value-of select="@Style"/></xsl:attribute>
            <xsl:attribute name="PreferredSize"><xsl:value-of select="@PreferredSize"/></xsl:attribute>
            <!--<y:Row.Labels> 
                <y:Label LabelModelParameter="{x:Static ysl:StretchStripeLabelModel.West}" Style="{y:GraphMLReference 1}" PreferredSize="72,15"> 
                  <y:Label.Text>Development</y:Label.Text>-->
        </xsl:element>
</xsl:template>
<xsl:template match="Row">
    <xsl:element name="Row">
        <xsl:attribute name="MinimumSize"><xsl:value-of select="@MinimumSize"/></xsl:attribute>
        <xsl:attribute name="Size"><xsl:value-of select="@Size"/></xsl:attribute>
        <xsl:attribute name="Insets"><xsl:value-of select="@Insets"/></xsl:attribute>
        <xsl:attribute name="Style"><xsl:value-of select="@Style"/></xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="Table">
    <xsl:element name="Table">
        <xsl:attribute name="Insets"><xsl:value-of select="@Insets"/></xsl:attribute>
        <xsl:attribute name="RelativeLocation"><xsl:value-of select="@RelativeLocation"/></xsl:attribute>
        <xsl:element name="Table.Rows">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:element>
</xsl:template>
<xsl:template match="TableNodeStyle.Table">
    <xsl:element name="TableNodeStyle.Table">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="TableNodeStyle">
    <xsl:element name="TableNodeStyle">
        <xsl:attribute name="TableRenderingOrder"><xsl:value-of select="@TableRenderingOrder"/></xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="/">
    <xsl:element name="graphml">
        <xsl:element name="graph">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>
于 2013-02-13T16:55:25.170 回答