繁体   English   中英

有什么方法可以使用xpath过滤/处理文字结果元素?

Is there any way to use xpath to filter/process literal result elements?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在处理一个样式表,以将类似于IETF(即xhtml)表但面向列的表转换为xsl-fo。

第一步之一是将<col />标记转换为<fo:table-column />标记。 不幸的是,由于某些原因,XSL 1.1规范的作者没有提供将所有属性自动从<fo:table-column />转移到相应列中的表格单元以及属性(宽度除外)的方法。 ),也不会自动应用(我认为这确实是愚蠢的设计决定- 这是天线之家的一位开发商在2001年抱怨同一件事! )。 继承也不适用,因为<fo:table-column />没有任何子代。

剩下的任务是弄清楚已为每列设置了哪些格式设置属性,然后手动将其应用于适当的表单元格。 但是,如何最好地做到这一点呢? 我曾经想到的是将所有<fo:table-column />节点放入一个变量中,但是然后我将如何使用xpath处理这些节点? 另一个想法是,必须有一种使用临时结果树的方法,但是从未使用过这种方法,因此对于是否可行以及如何使用临时结果树一无所知。 我张贴这个问题有标签XSLT 1.0和XSLT 2.0只是为了看看没有一个答案,但我真的限制使用XSLT 1.0这个问题。

编辑:有人要求一个具体的例子。 源文档片段可能看起来像这样:

<table>
  <col width="33%" font-weight="bold" border="1pt solid black"/>
  <col width="34%" span="2" color="red" background-color="gray"/>
  <col font-style="italic" align="center" background-color="yellow"/>
  <tr><td>A</td><td>B</td><td>C</td><td>D</td></tr>
  <tr><td>dog</td><td>cat</td><td>mouse</td><td>elephant</td></tr>
  ...
</table>

即标准xhtml表,除了一些通常使用style属性表示的属性。

那么自然翻译就是

<table> -->  <fo:table>
<col/>  -->  <fo:table-column/>
<tr>    -->  <fo:table-row>
<td>    -->  <fo:table-cell>

但是,这存在一个问题,即<table-column />中的任何属性都不会自动应用于对应列中的表单元格,除非您特别要求使用from-table-colum()函数来调用它们(与宽度的除外,它自动应用)。 因此,例如,对于表格第三列中的表格单元格,我需要像这样输出fo:

<fo:table-cell color="from-table-column()" background-color="from-table-column()>

对于第4列中的表格单元,我需要输出

<fo:table-cell font-style="from-table-column()" align="from-table-column()" background-color="from-table-column()>

问题是您如何知道要为特定列中的表单元格查找哪些属性?

2 个回复

在XSLT 1.0中,包含结果节点的变量是结果树片段,要将其转换为要应用XPath或进一步处理节点的节点集,您可以使用exsl:node-set或类似示例

<xsl:variable name="v1-rtf">
  <fo:table-column>...</fo:table:column>
</xsl:variable>

<xsl:variable name="v1-ns" xmlns:exsl="http://exslt.org/common" select="exsl:node-set($v1-rtf)"/>

<xsl:apply-templates select="$v1-ns/fo:table-column"/>

XSLT 2.0中的唯一区别是,您不需要exsl:node-set函数及其转换操作,可以直接将任何变量与临时树一起使用,例如

<xsl:variable name="v1">
  <fo:table-column>...</fo:table:column>
</xsl:variable>

<xsl:apply-templates select="$v1/fo:table-column"/>

警告 :我对XSL-FO一无所知; 这只是您可以使用的起点。

以我理解您的问题的方式,您希望每个表单元格都具有与源文档中相应col相同的属性列表。 通过查看当前处理的td的位置并使用该位置在相同的相对位置查找col ,将非常容易实现。 但是,由于某些col元素具有span属性,因此并非如此简单。

我建议的解决方案是从“枚举” col元素开始,以便它们与列一样多。 有了这个,我们可以按计划进行。

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="columns">
    <xsl:for-each select="/table/col">
        <xsl:call-template name="replicate">
            <xsl:with-param name="n">
                <xsl:choose>
                    <xsl:when test="@span">
                        <xsl:value-of select="@span"/>
                    </xsl:when>
                    <xsl:otherwise>1</xsl:otherwise>
                </xsl:choose>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:for-each>
</xsl:variable>

<xsl:template match="/table">
    <fo:table>
        <xsl:apply-templates/>  
    </fo:table>
</xsl:template>

<xsl:template match="tr">
    <fo:table-row>
        <xsl:apply-templates select="td"/>
    </fo:table-row>
</xsl:template>

<xsl:template match="td">
    <xsl:variable name="i" select="position()" />
    <fo:table-cell>
        <xsl:for-each select="exsl:node-set($columns)/col[$i]/@*[not(name()='width' or name()='span')]">
            <xsl:attribute name="{name()}">from-table-column()</xsl:attribute>
        </xsl:for-each>
        <xsl:apply-templates/>  
    </fo:table-cell>
</xsl:template>

<xsl:template name="replicate">
    <xsl:param name="n"/>
    <xsl:if test="$n">
        <xsl:copy-of select="."/>
        <xsl:call-template name="replicate">
            <xsl:with-param name="n" select="$n - 1"/>
        </xsl:call-template>        
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

当应用于您的输入示例时,将产生以下结果

<?xml version="1.0" encoding="utf-8"?>
<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:table-row>
      <fo:table-cell font-weight="from-table-column()" border="from-table-column()">A</fo:table-cell>
      <fo:table-cell color="from-table-column()" background-color="from-table-column()">B</fo:table-cell>
      <fo:table-cell color="from-table-column()" background-color="from-table-column()">C</fo:table-cell>
      <fo:table-cell font-style="from-table-column()" align="from-table-column()" background-color="from-table-column()">D</fo:table-cell>
   </fo:table-row>
   <fo:table-row>
      <fo:table-cell font-weight="from-table-column()" border="from-table-column()">dog</fo:table-cell>
      <fo:table-cell color="from-table-column()" background-color="from-table-column()">cat</fo:table-cell>
      <fo:table-cell color="from-table-column()" background-color="from-table-column()">mouse</fo:table-cell>
      <fo:table-cell font-style="from-table-column()" align="from-table-column()" background-color="from-table-column()">elephant</fo:table-cell>
   </fo:table-row>
</fo:table>

这是假设表单元格本身没有跨度。 否则这可能变得更加复杂。

4 传入变量以使用 xpath 查找元素

我正在开发这个程序,用 selenium 在 python 中执行一些自动化任务。 系统会提示用户输入他们的项目名称。 然后程序将打开网站并选择与用户输入的名称相同的项目。 我将使用 xpath 选择元素。 但是,如果站点上有许多项目,它们都具有相同的class 。 所以我想我可以使用 xpath ...

5 根据子元素的内容使用XPath过滤XML

我需要过滤SOAP Web服务的响应。 由于SOAP基于XML,因此我正在考虑使用libxml2,但是我无法理解如何编写XPath表达式来实现所需的结果。 在消息末尾,您将找到一个响应示例,其中发送了两个NotficationMessage,一个主题为tns1:RuleEngine/Li ...

7 如何根据XPATH过滤元素?

我想选择仅在顶级国家或仅在其他国家/地区之后的跨度元素 我试过//*[text()='Top Countries']/../following-sibling::span and not(//*[text()='Other']/../following-sibling::span) ...

9 使用XPath处理Mule中的可选元素

所以我正在尝试使用xpath表达式将SOAP响应保存到数据库中 但是我想知道如何处理“关系”元素。 它是可选的,如果存在,它可以存在多次,并且元素可以具有不同的名称,这取决于Relation的类型。 如果存在,我总是想保存所有内容,所以我想知道最好的方法是什么? 问候 编 ...

10 在PHP中使用xPath处理子元素

我有一个XML文档,其中包含一个元素(名为region ),该元素可能有也可能没有多个子元素。 对于我的导入,我需要确保只有一个子元素。 如果还有更多子元素,那么我需要删除所有子元素,最后一个除外。 可能会发生以下情况: 我需要过滤XML以重新格式化region元素的子元素,使其始 ...

2016-07-14 09:55:14 2 231   php/ xpath
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM