两个文件中的其他文件匹配ID值的XSLT导入元素

时间:2017-05-27 18:41:23

标签: xml xslt

我遇到问题,包括来自第二个XML文件的元素,需要有关正确的XSLT模板代码的建议。

我的第一个输入文件(在Ubuntu计算机上使用xsltproc(XSLT 1.0)处理的文件是)(此测试文件只有一个"条目"元素以保持简短):



<?xml version="1.0" encoding="UTF-8"?>

<tellico>
      <collection title="My Videos" type="3">

<entry id="1002">
<title>Midsomer Murders -- Set 25</title>
<id>1002</id>
<comments>Includes bonus material</comments>
<year>2013</year>
<cover>file:///data/www/htdocs/videodb/cache/img/1002.jpg</cover>
<running-time>90</running-time>
<medium>DVD</medium>
<genres></genres>
<set>Yes</set>
<count>3</count>
<location>2</location>
</entry>

</collection>
</tellico>
&#13;
&#13;
&#13;

第二个输入文件包含我需要在输出中添加的元素作为&#34;类型&#34;的子元素。元素,但我需要的只是&#34;名称&#34;元件。

&#13;
&#13;
<?xml version="1.0" encoding="UTF-8"?>
<ooo_calc_export scriptVersion="2.2.0_qdxml" scriptUpdate="2011-03-02" scriptURL="http://www.digitalimprint.com/misc/oooexport/" scriptAuthor="vjl">
  <ooo_sheet num="1">

    <video_genre><id>1001</id><name>Crime</name></video_genre>
    <video_genre><id>1001</id><name>Drama</name></video_genre>
    <video_genre><id>1001</id><name>Mystery</name></video_genre>
    <video_genre><id>1002</id><name>Crime</name></video_genre>
    <video_genre><id>1002</id><name>Drama</name></video_genre>
    <video_genre><id>1002</id><name>Mystery</name></video_genre>
    <video_genre><id>1003</id><name>Adventure</name></video_genre>
    <video_genre><id>1003</id><name>Drama</name></video_genre>
    <video_genre><id>1003</id><name>Sci-Fi</name></video_genre>
    <video_genre><id>1004</id><name>Drama</name></video_genre>
    <video_genre><id>1004</id><name>History</name></video_genre>
    <video_genre><id>1005</id><name>Action</name></video_genre>
    <video_genre><id>1005</id><name>Adventure</name></video_genre>
    <video_genre><id>1005</id><name>Drama</name></video_genre>
    <video_genre><id>1005</id><name>War</name></video_genre>
    <video_genre><id>1006</id><name>Documentary</name></video_genre>
    <video_genre><id>1007</id><name>Crime</name></video_genre>
    <video_genre><id>1008</id><name>Comedy</name></video_genre>
    <video_genre><id>1008</id><name>Drama</name></video_genre>
    <video_genre><id>1009</id><name>Drama</name></video_genre>
    <video_genre><id>1010</id><name>Adventure</name></video_genre>
    <video_genre><id>1010</id><name>Comedy</name></video_genre>
    <video_genre><id>1010</id><name>Crime</name></video_genre>

  </ooo_sheet>
</ooo_calc_export>
&#13;
&#13;
&#13;

我目前(不工作)的转换是:

&#13;
&#13;
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

	<!-- establish file path to XML file with Genre data -->
	<xsl:variable name="genre-doc" select="document('genres.xml')"/>

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

   <xsl:template match="genres">
		<!-- save current entry's id value -->
		<xsl:variable name="video-id" select="../id/text()"/>   
		 <!-- <current-video-id><xsl:value-of select="$video-id" /></current-video-id>  DEBUG Only -->
		<genres>
			<!-- Fetch 'video_genre' elements from external file -->
			<xsl:variable name="genre-info" select="document($genre-doc)/ooo_calc_export/ooo_sheet/video_genre[id=$video-id]/." />
			<xsl:for-each  select="$genre-info/*">
				<genre><xsl:value-of select="name" /></genre>
	      	Genre data goes here
			</xsl:for-each>
		</genres>
   </xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

我收到与阅读第二个文件有关的错误

&#13;
&#13;
$ xsltproc -o output-genre.xml transform-genre.xslt test-input-genre.xml
warning: failed to load external entity "1001Crime1001Drama1001Mystery1002Crime1002Drama1002Mystery1003Adventure1003Drama1003Sci-Fi1004Drama1004History1005Action1005Adventure1005Drama1005War1006Documentary1007Crime1008Comedy1008Drama1009Drama1010Adventure1010Comedy1010Crime"
&#13;
&#13;
&#13;

似乎第二个文件正在被访问,但没有得到我想要的。它似乎是为整个文件获取Text值(而不是XML Elements)。我只想要&#34; id&#34;匹配&#34;视频ID&#34;从中我将仅使用&#34; name&#34;的值。元件。可能是XPATH的一个错误。

我想要的输出如下文所示:

&#13;
&#13;
<tellico>
  <collection title="My Videos" type="3">
    <entry id="1002">
      <title>Midsomer Murders -- Set 25</title>
      <id>1002</id>
      <comments>Includes bonus material</comments>
      <year>2013</year>
      <cover>file:///data/www/htdocs/videodb/cache/img/1002.jpg</cover>
      <running-time>90</running-time>
      <medium>DVD</medium>
      <genres>
			  <genre>Crime</genre>
			  <genre>Drama</genre>
			  <genre>Mystery</genre>
      </genres>
      <set>Yes</set>
      <count>3</count>
      <location>2</location>
    </entry>
  </collection>
</tellico>
&#13;
&#13;
&#13;

欢迎任何帮助 - 谢谢。

1 个答案:

答案 0 :(得分:1)

您获得的错误是由于您在定义document()变量时重复使用genre-info函数:

<xsl:variable name="genre-info" select="document($genre-doc)/ooo_calc_export/ooo_sheet/video_genre[id=$video-id]/." />

在定义document()变量时,您已使用genre-doc函数:

<xsl:variable name="genre-doc" select="document('genres.xml')"/>

所以现在你将外部XML文件的全部内容作为document()函数的参数提供 - 这当然会导致失败。

尝试将genre-info变量定义为:

<xsl:variable name="genre-info" select="$genre-doc/ooo_calc_export/ooo_sheet/video_genre[id=$video-id]"/>

然后:

<xsl:for-each select="$genre-info">
    <genre><xsl:value-of select="name" /></genre>
</xsl:for-each>