如果来自另一个节点的规则适用,则添加位置编号,但按照当前节点的顺序

问题描述 投票:0回答:2

输入:

<ROOT>
  <TEMPLATE style="test">
      <ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT></VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="test">
      <ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT></VALUE></ATTRIBUTE>
      <ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="something-else">
      <ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="footnotes">
      <ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE>
  </TEMPLATE>
<ROOT>

所需输出:

<ROOT>
  <TEMPLATE style="test">
      <ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT> *1</VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="test">
      <ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT> *2</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="something-else">
      <ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE>
  </TEMPLATE>
  <TEMPLATE style="footnotes">
      <ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE>
      <ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE>
  </TEMPLATE>
<ROOT>

在我的样式为“test”的模板中,有些属性的名称+前缀“FOOTNOTE_”可以与模板“footnotes”中的属性名称匹配。如果名称匹配,则应将 " * {position}" 添加到属性值中。该位置计算已设置的脚注数量,但顺序基于测试样式属性而不是脚注。

我已经尝试过各种分组尝试和 for-each 循环,但它们从未达到预期的结果。

我正在使用 XSLT 2.0

xslt position xslt-2.0 xslt-grouping
2个回答
0
投票

我可能会分两步完成 - 说这样的话:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="fn" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name, 'FOOTNOTE_')" />

<xsl:template match="/">
    <xsl:variable name="temp">
        <xsl:apply-templates mode="temp"/>
    </xsl:variable>
    <xsl:apply-templates select="$temp/ROOT"/>
</xsl:template>

<!-- identity transform -->
<xsl:template match="@*|node()" mode="#all">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="#current"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE[key('fn', @name)]/VALUE" mode="temp">
    <xsl:copy>
        <xsl:apply-templates/>
        <NUMBER/>
    </xsl:copy>
</xsl:template>

<xsl:template match="NUMBER">
    <xsl:text> *</xsl:text>
    <xsl:number count="NUMBER" level="any"/>
</xsl:template>

</xsl:stylesheet>

请注意,结果是混合内容的 XML,这是您通常想要避免的。


0
投票

试试这个:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

  <xsl:key name="footnote" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name,'FOOTNOTE_')"/>
  
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE/VALUE">
    <xsl:variable name="name"  select="parent::*/@name"/>
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <xsl:variable name="footnode" as="element()?" select="key('footnote',$name)"/>
      <xsl:if test="$footnode">
        <xsl:value-of select="concat(' *',(count(parent::*/preceding-sibling::*) + 1))"/>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.