繁体   English   中英

XSLT模板输出子元素

[英]XSLT template to output child elements

我在使用XSLT时遇到问题,需要帮助。 我用这个帖子代替了原来的帖子。 我有一个带有空元素的XML文件,最终我希望使用第二个XML文件中的内容进行扩展。 我在Ubuntu上使用xsltproc (XSLT 1.0)作为处理引擎。

我注意到身份模板没有从输入中复制DOCTYPE(如果应该这样做)。

我创建了一个简化的测试输入文件和一个简化的XSLT文件。 我仍然无法获得“类型” XSLT模板来执行任何操作。 我更改了该模板以删除命名的元素-但它不会那样做。

新输入XML-

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tellico PUBLIC '-//Robby Stephenson/DTD Tellico V11.0//EN' 'http://periapsis.org/tellico/dtd/v11/tellico.dtd'> <tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="11"> <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> 

新的XSLT转换文件-

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- the identity template (copies your input verbatim) --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> </xsl:copy> </xsl:template> <!-- special templates only for things that need them --> <xsl:template match="genres"/> </xsl:stylesheet> 

处理命令:

 xsltproc -o merged.xml --novalid Identity.xslt test-input-merge.xml 

我必须使用--novalid选项,因为periapsis.org网站此时已关闭。

我得到的输出是:

 <?xml version="1.0"?> <tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="11"> <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/> <set>Yes</set> <count>3</count> <location>2</location> </entry> </collection> </tellico> 

根据XSLT转换,据我有限的理解-输出中不应该包含“流派”元素,而应该包括在内。 目前,这只是一种测试,目的是试图弄清楚如何使流派模板做某事。

我希望这会在我的原始帖子中有所改善,并且让别人看到问题所在。 感谢所有您提供的帮助。

match="entry[genres]"表示匹配的元素是内部具有genres entry

因此,此模板处理整个entry元素(不是genres )。

结果如何? 我使用您的XML和XSLT进行了测试,并得到:

<?xml version="1.0" encoding="ISO-8859-1"?>
    Genre data goes here

因此,此模板仅输出其内容,而不是整个源,因此身份模板没有机会进行任何处理。

可能您应该编写match="entry/genres" 也许只是match="genres"就足够了?

编辑

模板不起作用的真正原因是您忘记了名称空间问题,即根标记中的namespace声明。

它导致:

  • 您所有的标签都位于上述命名空间中,而不是默认(空)命名空间中,
  • 您的模板尝试匹配空名称空间中的genres元素。

因此,您可以在源XML中保留属性,包括namespace ,但在XSLT中进行以下更改:

  • stylesheet标记必须包含带有某些前缀的该名称空间的声明,例如xmlns:tel="http://periapsis.org/tellico/"
  • 模板中的match属性必须仅引用此名称空间,即包括上述前缀: <xsl:template match="tel:genres"/>

DOCTYPE行而言:

使用xsltransform.net,我尝试将此行包含在源XML中,但出现以下错误:

Error on line 1 column 2 of http://periapsis.org/:
  SXXP0003: Error reported by XML parser: The markup declarations
  contained or pointed to by the document type declaration must
  be well-formed.

可能的原因是所引用的.dtd文件无法访问或某些错误。 因此,我同意你的看法,即应删除这一行。

我不知道为什么match="entry[genres]"entry元素不匹配,但这还是错误的。 您需要的是这样的:

<xsl:template match="genres">
  <xsl:copy-of select="document($with)"/>
</xsl:template>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM