2

我一直在 w3schools.com 上阅读有关 xpath 轴的信息,并且一直在尝试寻求帮助,但我很难弄清楚要实际搜索什么。

我有一个 xsl 样式表,用于将各种 xml 文件转换为 pdf 打印。我坚持的部分是,当我需要更改某些格式时,我已经确定了至少 3 种不同的场景。我已经找到了一种在两种情况下更改格式的方法,但第三种是其他两种情况的混合体,当我只想要一组格式时,我一直在显示两组格式。

请让我知道是否有任何其他信息有用,谢谢!

场景一:

<TASK>
    <REVST>Some revised text
</TASK>

场景二:

<LIST>
  <PARA>
    <REVST />Some Text <REVEND />
  </PARA>
</LIST>

场景 3:

<TASK>
   <PARA>
      <REVST />Some other revised text <REVEND />
   </PARA>
 </TASK>

似乎适用于场景 1 的方法是将其<xsl:if test="parent::*TASK/REVST">放在样式表的一部分中,该样式表执行一个 for-each 并遍历每个“ITEM”。似乎适用于场景 2 的方法是<xsl:if test="descendant::REVST">在 PARA 模板中进行此测试。

但是对于场景 3,我最终都显示,而它应该只是来自 PARA 模板的格式。

有什么建议么?甚至是搜索词的建议?任何帮助将不胜感激 :)

我知道我有很多东西要学,我很感激所提供的帮助,但我仍然不太明白如何让它不显示修订格式(页面右侧的一个栏)当只有部分文本被指出需要修改时,是否需要对整个文件进行修改?

<LIST>
<PARA>
    <REVST/>
    THIS IS SOME TEXT THAT SHOULD BE MARKED BY A REVISION BAR.
    <REVEND/>
</PARA>
</LIST>

而像这样的案例,我需要为基本上整个文档显示一个修订栏。

<TASK>
  <ELE1/>
    <REVST/>
    <ELE2/>
    <TITLE>The Title</TITLE>
    <ELE3>
      <ELE4>
        <TITLE>General</TITLE>
        <LIST>
          <LITEM>
            <PARA>This is some paragraph text.</PARA>
          </LITEM>
        </LIST>
      </ELE4>
    </ELE3>
</TASK>

我尝试了所呈现的内容,但除非我在文本或 PARA 部分添加 *,否则它似乎并不适用。我可能在那里也遗漏了一些东西。

<xsl:template match="TASK/*text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]">
    <fo:block color="red" border-right="solid black 2pt" margin-right="16pt">
        <xsl:apply-templates />
    </fo:block>
</xsl:template>
<xsl:template match="LIST1/*PARA/text()[preceding-sibling::*[1][self::REVST] and following-sibling::*[1][self::REVEND]]">
    <fo:block color="green" border-right="solid black 2pt" margin-right="16pt">
        <xsl:apply-templates />
    </fo:block>
</xsl:template>

有什么额外的建议吗?我仍然被困住:(

4

3 回答 3

2

我一直在 w3schools.com 上阅读有关 xpath 轴的信息

这不是一个好的学习策略。w3schools 非常方便查找您曾经知道但已经忘记的东西,但它的组织方式无法帮助您理解基本概念。给自己买一本好书。

您的帖子向我表明您还没有理解上下文的重要概念。XPath 表达式的含义在很大程度上取决于上下文节点在其被评估点的位置。如果您确实了解上下文,我假设您会告诉我们使用这些表达式的上下文是什么。

于 2012-08-07T05:41:40.480 回答
1

以下是如何做到这一点

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match=
 "TASK/text()[preceding-sibling::*[1][self::REVST]
            and
              following-sibling::*[1][self::REVEND]
              ]">

  Processing Type1 of: "<xsl:value-of select="."/>"
 </xsl:template>

 <xsl:template match=
 "LIST/PARA/text()[preceding-sibling::*[1][self::REVST]
                 and
                   following-sibling::*[1][self::REVEND]
                   ]">

  Processing Type2 of: "<xsl:value-of select="."/>"
 </xsl:template>

 <xsl:template match=
 "TASK/PARA/text()[preceding-sibling::*[1][self::REVST]
                 and
                   following-sibling::*[1][self::REVEND]
                   ]">

  Processing Type3 of: "<xsl:value-of select="."/>"
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<t>
 <TASK> <REVST/>Some revised text<REVEND/> </TASK>
 <LIST> <PARA> <REVST />Some other revisedext <REVEND /> </PARA> </LIST>
 <TASK> <PARA> <REVST />Some yet other revised text <REVEND /> </PARA> </TASK>
</t>

产生了想要的结果(每个案例都以自己的方式处理):

  Processing Type1 of: "Some revised text"


  Processing Type2 of: "Some other revisedext "


  Processing Type3 of: "Some yet other revised text "

要记住的规则

将 XSLT 用作 ... XSLT。

这意味着:总是喜欢模板而不是内联xsl:for-each。前者的结果是简短、简单、不易出错、干净、更易于理解和维护的代码。后者会导致更长、更复杂、更丑陋、类似意大利面条的代码,这些代码容易出错、难以理解、难以扩展和维护。

于 2012-08-07T02:40:57.180 回答
0

为什么不每次都使用完整路径:

/TASK/REVST
/LIST/PARA
/TASK/PARA/REVST
于 2012-08-06T22:20:17.187 回答