在XSLT中解析处理指令

时间:2014-02-13 05:27:40

标签: c# xml xslt processing-instruction

我有以下XML。

<sec xmlns:xlink="http://www.w3.org/1999/xlink" id="fm2" sec-type="other">
  <title />
  <?SAE page="ii"?>
  <p><bold>Other SAE books of interest:</bold></p>
  <p><bold>Electric and Hybrid-Electric Vehicles</bold></p>
  <p>Edited by Ronald K. Jurgen</p>
  <p>(Product Code: PT-143.SET)</p>
  <p><bold>Diesel Emissions and Their Control</bold></p>
  <p>By Magdi K. Khair and W. Addy Majewski</p>
  <p>(Product Code: R-303)</p>
  <p><bold>Hybrid Powered Vehicles, Second Edition</bold></p>
  <p>By John M. German</p>
  <p>(Product Code: T-125)</p>
  <p>For more information or to order a book, contact SAE International at</p>
  <p>400 Commonwealth Drive, Warrendale, PA 15096-0001, USA;</p>
  <p>phone 877-606-7323 (U.S. and Canada only) or 724-776-4970 (outside U.S. and Canada);</p>
  <p>fax 724-776-0790;</p>
  <p>email <email>CustomerService@sae.org</email>;</p>
  <p>website <uri xlink:href="http://books.sae.org">http://books.sae.org</uri>.</p>
</sec>

我必须为它创建XSLT。我是这样做的:

<xsl:for-each select="book-front/sec">
  <xsl:value-of select="title"/>
  <xsl:value-of select="p"/>
</xsl:for-each>    

但它没有解析任何东西。

主要问题是解析<?SAE page="ii"?>它不允许解析其他属性。我不知道如何解析它,然后它将对应的XSLT。

我的xml是

<sec id="ch1.4">
<label><bold>1.4</bold></label>
<title><bold>Energy Consumption of Commercial Vehicles</bold></title>
<p>Commercial vehicle manufacturing and operation is a major source of energy consumption globally. In 2009, the United States consumed 23&#x0025; of the global petroleum production &#x005B;<xref ref-type="bibr" rid="R3">1.3</xref>&#x005D;. According to the U.S. Department of Energy, 72&#x0025; <?SAE page="8"?>of the U.S. petroleum consumption is for transportation. Commercial vehicles consumed up to 18.7&#x0025; of the total energy consumption in transportation in the United States. In other words, commercial vehicles in the United States alone consumed over 3&#x0025; of the global petroleum production in 2009 &#x005B;<xref ref-type="bibr" rid="R3">1.3</xref>, <xref ref-type="bibr" rid="R34">1.34</xref>&#x005D;.</p></sec>

应用你的代码后,我得到了

Commercial vehicle manufacturing and operation is a major source of energy consumption globally. In 2009, the United States consumed 23&#x0025; of the global petroleum production &#x005B; 

但我想要

**Energy Consumption of Commercial Vehicles**
Commercial vehicle manufacturing and operation is a major source of energy consumption globally. In 2009, the United States consumed 23&#x0025; of the global petroleum production &#x005B;1.3 &#x005D;. According to the U.S. Department of Energy, 72&#x0025;Page 8 of the U.S. petroleum consumption is for transportation. Commercial vehicles consumed up to 18.7&#x0025; of the total energy consumption in transportation in the United States. In other words, commercial vehicles in the United States alone consumed over 3&#x0025; of the global petroleum production in 2009 &#x005B;

现在解释如何获得此输出?我希望你的问题现在更容易理解。

2 个答案:

答案 0 :(得分:1)

您可以使用

<xsl:template match="processing-instruction('SAE')">
  <xsl:value-of select="." />
</xsl:template>

匹配名为SAE的处理指令。 (并<xsl:apply-templates select="processing-instruction('SAE')" />,自然而然地)

指令的值实际上不是XML,即使它在这种情况下看起来像常规属性。

处理指令实际上只包含纯文本,因为它们可能是任何东西 - 从简单的信息位到用XSLT以外的语言完成程序。

您只能获取指令的内容,在您的情况下是字符串'page="ii"',然后您必须手动解析。

你可以在XPath中这样做:

<xsl:template match="processing-instruction('SAE')">
  <xsl:variable name="start-token">page="</xsl:variable>
  <xsl:variable name="end-token">"</xsl:variable>
  <xsl:variable name="temp" select="substring-after(., $start-token)" />

  <xsl:value-of select="substring-before($temp, $end-token)" />
  <!-- output: "ii" -->
</xsl:template>

答案 1 :(得分:0)

如果您想简单复制整个内容,请执行以下操作:

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

这称为身份模板。然后,创建模板匹配以覆盖复制的节点。如果是外部参照,您可以尝试。

<xsl:template match="xref">
    <a href="{@rid}">
        <xsl:apply-templates/>
    </a>
</xsl:template>