代码之家  ›  专栏  ›  技术社区  ›  markwatson

XSLT转换替换通过文档定期显示的标记

  •  3
  • markwatson  · 技术社区  · 15 年前

    我有一个XML文档,我正在用XSLT将其转换为XSL FO文档。我有一个棘手的问题,我一直在努力寻找一个解决办法…

    在我的源XML中,有一些标记散布在各处。我想在结果文档中将这些设置为下划线格式,但是我没有这样做。

    我正在尝试使用这样的代码:

    <xsl:template match="//em">
      <fo:inline text-decoration="underline">
        <xsl:apply-templates select="*|text()"/>
      </fo:inline>
    </xsl:template>
    

    完整的XSLT如下所示:

    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format"
      version="1.0">
    
    
    
      <!-- match em tags -->
      <xsl:template match="//em">
        <fo:inline text-decoration="underline">
          <xsl:apply-templates select="*|text()"/>
        </fo:inline>
      </xsl:template>
      <xsl:template match="//u">
        <fo:inline text-decoration="underline">
          <xsl:apply-templates select="*|text()"/>
        </fo:inline>
      </xsl:template>
    
      <!-- match b tags -->
      <xsl:template match="//b">
        <fo:inline font-weight="bold">
          <xsl:apply-templates select="*|text()"/>
        </fo:inline>
      </xsl:template>
    
      <xsl:template match="//br">
        <fo:block><xsl:text>&#xA;</xsl:text></fo:block>
      </xsl:template>
    
      <xsl:template match="briefs">
        <fo:root>
          <fo:layout-master-set>
            <fo:simple-page-master master-name="Evidence" page-width="8.5in" page-height="11in" margin="1in">
              <fo:region-body margin-bottom=".5in" margin-top=".5in" region-name="xsl-region-body" />
              <fo:region-before extent="1em" region-name="xsl-region-before" />
              <fo:region-after extent="1em" region-name="xsl-region-after" />
            </fo:simple-page-master>
          </fo:layout-master-set>
          <xsl:for-each select="brief">
            <fo:page-sequence master-reference="Evidence">
            <fo:static-content flow-name="xsl-region-before" font-family="Times">
               <fo:block font-size="10pt" text-align="center" color="#666666">
                <fo:inline font-style="italic"><xsl:value-of select="title"/></fo:inline> by <xsl:value-of select="author"/>
               </fo:block>
            </fo:static-content>
    
            <fo:static-content flow-name="xsl-region-after" font-family="Times" font-size="10pt">
              <fo:table>
                <fo:table-column />
                <fo:table-column column-width="1in" />
                <fo:table-body>
                  <fo:table-row>
                    <fo:table-cell>
                      <fo:block text-align="left" color="#666"><xsl:value-of select="copyright"/></fo:block>
                    </fo:table-cell>
                    <fo:table-cell>
                      <fo:block text-align="right" font-weight="bold">
                        Page <fo:page-number/>
                      </fo:block>
                    </fo:table-cell>
                  </fo:table-row>
                </fo:table-body>
              </fo:table>
            </fo:static-content>
    
            <fo:flow flow-name="xsl-region-body" font-family="Times">
              <fo:block font-size="14pt" text-align="center" text-transform="uppercase" border-before-width="2pt" border-before-color="black" border-before-style="double" border-after-width="1pt" border-after-color="black" border-after-style="solid" background-color="#ccc">
                <xsl:value-of select="title"/>
               </fo:block>
    
              <xsl:for-each select="heading">
                <xsl:choose>
                  <xsl:when test="@level = 2">
                    <fo:block font-size="11pt" font-weight="bold" keep-with-next="always" text-transform="uppercase" padding-before="1em">
                      <xsl:value-of select="title"/></fo:block>
                  </xsl:when>
                  <xsl:when test="@level = 3">
                    <fo:block font-size="10pt" font-weight="normal" keep-with-next="always" text-transform="uppercase" padding-before="1em">
                      <xsl:value-of select="title"/></fo:block>
                  </xsl:when>
                  <xsl:otherwise>
                    <fo:block font-size="12pt" font-weight="bold" keep-with-next="always" text-transform="uppercase" padding-before="1em">
                      <xsl:value-of select="title"/></fo:block>
                  </xsl:otherwise>
                </xsl:choose>
    
                <xsl:for-each select="content/item">
                  <xsl:choose>
                    <xsl:when test="@type = 'card'">
                      <!--Print the taglines-->
                      <fo:block font-size="10pt" font-weight="bold" padding-before="1em" keep-with-next="always">
                        <!--<xsl:number value="position()" format="1" />. -->
                        <xsl:value-of select="tagline"/>
                      </fo:block>
    
                      <!--Print the citation-->
                      <fo:block font-size="10pt" font-style="italic" keep-with-next="always" keep-together.within-page="always" margin-left=".25in" padding-before=".5em">
                        <!--<xsl:number value="position()" format="1" />. -->
                        <xsl:value-of select="citation" disable-output-escaping="yes" />
                      </fo:block>
    
                      <!--Print the body-->
                      <fo:block font-size="10pt" keep-together.within-page="always" margin-left=".25in" padding-before=".5em">
                        <!--<xsl:number value="position()" format="1" />. -->
                        <xsl:value-of select="quote" disable-output-escaping="yes" />
                      </fo:block>
    
                    </xsl:when>
                    <xsl:otherwise>
                      <fo:block font-size="10pt" padding-before=".5em"><xsl:value-of select="."/></fo:block>
                    </xsl:otherwise>
                  </xsl:choose>
                </xsl:for-each>
    
              </xsl:for-each>
    
    
            </fo:flow>
    
          </fo:page-sequence>
          </xsl:for-each>
        </fo:root>
      </xsl:template>
    
    </xsl:stylesheet>
    

    有人有什么想法吗? 非常感谢!!!!!!!

    3 回复  |  直到 15 年前
        1
  •  7
  •   Marc Gravell    15 年前

    我不清楚您的代码在文档中的实际“疯狂”位置,即运行匹配项。如果 <briefs> 是根节点,那么我希望看到一些 <xsl:apply-templates select="*"/> 或者在某一点上类似;否则 只有 将获得根匹配中指定的输出(它将永远不会应用 <em> 等火柴)。

    如果您只想在定义时使用替换来处理整个文档,那么经典匹配如下:

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    

    因为它匹配所有节点和级联,所以它会针对每个节点运行,直到找到更具体的匹配为止。因此,对于XSLT:

    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>
    <xsl:template match="bar">
      <BAR/>
    </xsl:template>
    

    大多数节点将“按原样”重复,但 <bar> 元素将替换为 <BAR/> (没有任何属性/内容)。

    注意,即使这样,你 需要 如果希望子数据由匹配项处理(如 <酒吧酒吧; 上面的例子,其中 层叠)。我什么也看不见 <xsl:apply-templates> 在你 <简介; 比赛。

    最后; match="//em" 是多余的; match="em" 应该足够了。

        2
  •  1
  •   lavinio    15 年前

    看不到整个样式表没有帮助,但是匹配语法应该是 match="em" match="//em" .

        3
  •  0
  •   slf    15 年前

    似乎您是在强制性地执行XSLT,而不是声明性地执行。MG是对的,我想如果你少做一点,你会更幸运的。” for-each “-ing及更多” apply-templates “ing”。

    看起来你不符合 相对长度单位 节点,因为您没有在主根模板中应用模板。我想说的是,每一个地方你都有一个,你应该使用一个应用模板,而不是,但这有点学术性。