XML到XSLT模式并不匹配

时间:2016-01-17 14:56:13

标签: xml xslt xslt-1.0

我正在玩XSLT来完成一项小任务。 我有以下XML:

FeedContentId

我想从此XML中提取<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/PFeed/AllFeeds/FeedContent"> <xsl:value-of select="Id"/> </xsl:template> </xsl:stylesheet> 作为文本。

这是我的XSLT代码:

FeedContentId

但我没有输出MyProcess 1 MyMetadataId FeedContentId,而是获得以下内容: 1. Open up httpd-ssl.conf in path2xampp\apache\conf\extra 2. Look for the line Listen 443 3. Change port number to anything you want. I use 4430. ex. Listen 4430. 4. Replace every 443 string in that file with 4430. 5. Save the file.

你能指出我错过的东西吗?

2 个答案:

答案 0 :(得分:2)

首先需要一个模板来匹配根元素,然后匹配内部的内容。这个XSLT现在再次运行。 (例如,在http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog上测试)

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" indent="yes" omit-xml-declaration="yes" />

  <xsl:template match="/PFeed">
    <xsl:apply-templates select="AllFeeds/FeedContent"/>
  </xsl:template>

  <xsl:template match="FeedContent">
      <xsl:value-of select="Id"/>
  </xsl:template>
</xsl:stylesheet>

转型后的输出:

FeedContentId

但是,同样的事情(获得/PFeed/AllFeeds/FeedContent/Id节点)也可以通过评估上面的简单XPath表达式来实现。

答案 1 :(得分:1)

您当前的XSLT代码的输出是:

MyProcess 1 MyMetadataId FeedContentId

这是输入XML文档中的所有文本。这是因为样式表中只有一个模板,它不适用于输入文档中的所有内容。对于输入的一部分,XSLT处理器必须使用预定义的默认模板

元素的默认模板会跳过元素,文本节点的默认模板复制那些文本节点,而这恰好发生了什么。

解决方案是使用一个模板直接定位您感兴趣的内容(/PFeed/AllFeeds/FeedContent/Id),并编写另一个与文本节点匹配的模板:

<xsl:template match="text()"/>

覆盖文本节点的默认行为。

另外,如果您的输出格式是纯文本,则应使用

<xsl:output method="text"/>

并且可能摆脱多余的空间:

<xsl:strip-space elements="*"/>

XSLT样式表

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/PFeed/AllFeeds/FeedContent/Id">
     <xsl:value-of select="."/>
  </xsl:template>

  <xsl:template match="text()"/>

</xsl:stylesheet>

文字输出

 FeedContentId 

在线试用此解决方案here