从不同的文件中获取价值

时间:2013-11-28 12:02:38

标签: xml xslt

我有下面的XML。

<toc-div>
  <title>CHAPTER 1 INTRODUCTION</title>
  <subtitle>
    <content-style font-style="italic">David Smith</content-style>
  </subtitle>
  <toc-item>
    <toc-title>1. Love on the Star Ferry</toc-title>
    <toc-pg>2</toc-pg>
  </toc-item>
  <toc-item>
    <toc-title>2. Contracts, Torts, Copyrights and Other Mysteries of the Legal World</toc-title>
    <toc-pg>2</toc-pg>
  </toc-item>
</toc-div>

实际上,我希望获得与不同文档中的标题匹配的引用。

我的第二份文件是

<chapter num="1">
  <toc>
    <toc-part>
      <toc-div>
        <toc-item>
          <toc-title>1. Love on the Star Ferry</toc-title>
          <toc-pg>1.002</toc-pg>
        </toc-item>
        <toc-item>
          <toc-title>2. Contracts, Torts, Copyrights and Other Mysteries of the Legal World</toc-title>
          <toc-pg>1.004</toc-pg>
        </toc-item>
      </toc-div>
    </toc-part>
  </toc>
</chapter>

条件是首先应该在两种情况下匹配标题,然后应该采用并显示<toc-pg>。我可以使用下面的xslt重定向到该文档,但我无法知道如何检索这些值。下面是我试过的XSLT。

<xsl:template match="toc-item">
  <xsl:variable name="prent">
    <xsl:value-of select="substring-before(substring-after(../title,' '),' ')"/>
  </xsl:variable>
  <xsl:variable name="tex">
    <xsl:value-of select="./toc-title/text()"/>
  </xsl:variable>    
  <xsl:variable name="cha">
   <xsl:value-of select="$prent"/>
  </xsl:variable>

  <xsl:if test="document(concat('C:\Documents and Settings\u0138039\Desktop\Proview\HK\Business Law in Hong Kong\Source\Business Law in Hong Kong/Chapter ',$cha,'.xml'))/chapter/toc/toc-part/toc-div/toc-item/toc-title/text() = ./toc-title/text()">
    <xsl:copy-of select="$tex"/>    
    <xsl:apply-templates select="document(concat('C:\Documents and Settings\u0138039\Desktop\Proview\HK\Business Law in Hong Kong\Source\Business Law in Hong Kong/Chapter ',$cha,'.xml'))/chapter/toc/toc-part/toc-div/toc-item/toc-title" mode="x"/>
  </xsl:if>
</xsl:template>

请让我知道如何看到预期的价值。文件如下XSLTXML

2 个答案:

答案 0 :(得分:0)

虽然问题标题为“从不同文档中获取值”,但已发布的代码已包含“document()”命令,该命令可实现此目的。
真正的问题似乎是“如何在apply-templates选择中添加过滤器”。这是使用方括号完成的:

<xsl:template match="your_element">
  <xsl:variable name="filter" select="id"/>
  ... other stuff ...
  <xsl:apply-templates select="document('file.xml')/diff_element[diff_id=$filter]"/>
</xsl:template>

您可以使用“current()”来使用当前元素的值,而不是设置变量。我使用了通用元素名称而不是实际元素名称,因为这样更明显会发生什么。

答案 1 :(得分:0)

if条件应改为

<xsl:if test="document(concat('C:\Documents and Settings\u0138039\Desktop\Proview\HK\Business Law in Hong Kong\Source\Business Law in Hong Kong/Chapter ',$cha,'.xml'))/chapter/toc/toc-part/toc-div/toc-item/toc-title/text() = ./toc-title/text()">

            <xsl:value-of select="document(concat('C:\Documents and Settings\u0138039\Desktop\Proview\HK\Business Law in Hong Kong\Source\Business Law in Hong Kong/Chapter ',$cha,'.xml'))/chapter/toc/toc-part/toc-div/toc-item[toc-title=$tex]/toc-pg" />

        </xsl:if>

感谢大家的帮助。

由于