我遇到问题,包括来自第二个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;
第二个输入文件包含我需要在输出中添加的元素作为&#34;类型&#34;的子元素。元素,但我需要的只是&#34;名称&#34;元件。
<?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;
我目前(不工作)的转换是:
<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;
我收到与阅读第二个文件有关的错误:
$ xsltproc -o output-genre.xml transform-genre.xslt test-input-genre.xml
warning: failed to load external entity "1001Crime1001Drama1001Mystery1002Crime1002Drama1002Mystery1003Adventure1003Drama1003Sci-Fi1004Drama1004History1005Action1005Adventure1005Drama1005War1006Documentary1007Crime1008Comedy1008Drama1009Drama1010Adventure1010Comedy1010Crime"
&#13;
似乎第二个文件正在被访问,但没有得到我想要的。它似乎是为整个文件获取Text值(而不是XML Elements)。我只想要&#34; id&#34;匹配&#34;视频ID&#34;从中我将仅使用&#34; name&#34;的值。元件。可能是XPATH的一个错误。
我想要的输出如下文所示:
<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;
欢迎任何帮助 - 谢谢。
答案 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>