xslt模板不适用于直接子节点

谢尔格·伊苏波夫(SergеуIsupov)

我想基于服务器提供的xml生成html标记。元素可以包含其他元素。我必须使用XSLT 1.0

例如,我具有followinng xml结构:

<?xml version="1.0" encoding="UTF-8"?>

<StackPanel DataContext="" HAlign="Left" Orientation="Vertical" Padding="5" VAlign="Top">
  <Grid Cols="2" DataContext="" HAlign="Left" Padding="5" Rows="2" VAlign="Top">
     <Cells>
         <Cell Col="1" DataContext="" HAlign="Left" Padding="5" Row="0" VAlign="Top" />
         <Cell Col="0" DataContext="" HAlign="Left" Padding="5" Row="0" VAlign="Top">
             <Grid  Cols="1" Rows="1">
               <Cells>
                  <Cell Col="0" Row="0"></Cell>
               </Cells>
             </Grid>
         </Cell>
         <Cell Col="0" DataContext="" HAlign="Left" Padding="5" Row="1" VAlign="Top" />
         <Cell Col="1" DataContext="" HAlign="Left" Padding="5" Row="1" VAlign="Top" />
      </Cells>
   </Grid>
</StackPanel>

我正在尝试应用样式:

<?xml version="1.0" encoding="utf-8"?>
<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"
>
  <xsl:output method="html"/>
  <xsl:strip-space elements="*"/>

  <!--Entry point-->
  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>


  <!--Cell key-->
  <xsl:key name="cell-key" match="Cells/Cell" use="@Row"/>

  <!--Grid-->
  <xsl:template match="Grid">
    <div class="grid">
      <xsl:apply-templates select="Cells/Cell[generate-id(.) = generate-id(key('cell-key', @Row))]" />
    </div>
  </xsl:template>

  <!--Grid cell-->
  <xsl:template match="Cell">
    <div class="gridRow">
      <xsl:for-each select="key('cell-key', @Row)">
        <xsl:sort select="@Col"/>
        <div class="gridCell">
          <xsl:apply-templates select="*" />
        </div>
      </xsl:for-each>
    </div>
  </xsl:template>
</xsl:stylesheet>

我使用Muenchian方法生成网格行。但是,我没有申请直系子女,而是持平观点。

<div class="grid">
  <div class="gridRow">
    <div class="gridCell">
      <div class="grid"></div>
    </div>
    <div class="gridCell"></div>
    <div class="gridCell"></div>
  </div>
  <div class="gridRow">
    <div class="gridCell"></div>
    <div class="gridCell"></div>
  </div>
</div>

如何将单元放置到嵌套网格中?

1号

您将“故障”(更棘手的情况是)通过推广为<Cell Col="0" Row="0"></Cell>[内部网格的一部分]与@Row外部网格相同xsl:key行号相同,但网格深度不同。

因此,您必须将它们分开并使它们独立。

一种方法:

<?xml version="1.0" encoding="utf-8"?>
<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"
    >
    <xsl:output method="html"/>
    <xsl:strip-space elements="*"/>

    <!--Entry point-->
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>


    <!--Cell key-->
    <xsl:key name="cell-key" match="Cells/Cell" use="concat(count(ancestor::Grid), '|', @Row)"/>

    <!--Grid-->
    <xsl:template match="Grid">
        <div class="grid">
            <xsl:apply-templates select="Cells/Cell[generate-id(.) = generate-id(key('cell-key', concat(count(ancestor::Grid), '|', @Row)))]" />
        </div>
    </xsl:template>

    <!--Grid cell-->
    <xsl:template match="Cell">
        <div class="gridRow">
            <xsl:for-each select="key('cell-key', concat(count(ancestor::Grid), '|', @Row))">
                <xsl:sort select="@Col"/>
                <div class="gridCell">
                    <xsl:apply-templates select="*" />
                </div>
            </xsl:for-each>
        </div>
    </xsl:template>
</xsl:stylesheet>

结果

<div class="grid">
  <div class="gridRow">
     <div class="gridCell">
        <div class="grid">
           <div class="gridRow">
              <div class="gridCell"></div>
           </div>
        </div>
     </div>
     <div class="gridCell"></div>
  </div>
  <div class="gridRow">
     <div class="gridCell"></div>
     <div class="gridCell"></div>
  </div>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XSLT模板不适用于新创建的元素

来自分类Dev

XSLT不适用于xml

来自分类Dev

角度平移不适用于模板

来自分类Dev

AngularJS模板不适用于Spring

来自分类Dev

设置模板不适用于主页

来自分类Dev

用Javascript附加<head>元素可用于.innerHTML,但不适用于XML子节点

来自分类Dev

XSLT模板不适用于使用lxml的所有元素

来自分类Dev

样式不适用于子组件

来自分类Dev

子域名不适用于www

来自分类Dev

悬停不适用于子元素

来自分类Dev

节点检查器不适用于节点6.0.0

来自分类Dev

Django Flatpages模板标签不适用于模板继承

来自分类Dev

MPI代码不适用于2个节点,但适用于1个节点

来自分类Dev

XSL模板匹配模式适用于所有子节点

来自分类Dev

xslt不同值不适用于属性

来自分类Dev

xslt不同值不适用于属性

来自分类Dev

静态链接不适用于节点模块

来自分类Dev

docker stop不适用于节点进程

来自分类Dev

为什么innerTEXT不适用于节点?

来自分类Dev

节点中的for-of循环-和谐不适用于数组

来自分类Dev

Pharo Metalink不适用于#ifTrue:发送节点

来自分类Dev

CSS不适用于JS appendChild添加的节点

来自分类Dev

顶层等待不适用于节点14.13.-

来自分类Dev

npm不适用于最新的稳定节点吗?

来自分类Dev

删除节点不适用于简单XML(PHP)

来自分类Dev

gun.not() 方法不适用于嵌套节点

来自分类Dev

Kendo ui模板不适用于html编码符号

来自分类Dev

模板推导不适用于功能指针参考

来自分类Dev

为什么这些条件不适用于模板类型?