XML到XSLT模式没有';不匹配

XML到XSLT模式没有';不匹配,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,为了一个小任务,我正在使用XSLT。 我有以下XML: <PFeed> <PID> MyProcess </PID> <Version>1</Version> <MetaData> <Id> MyMetadataId </Id> </MetaData> <AllFeeds> <FeedContent> <Id&

为了一个小任务,我正在使用XSLT。 我有以下XML:

 <PFeed>
  <PID> MyProcess </PID>
  <Version>1</Version>
  <MetaData>
      <Id> MyMetadataId </Id>
  </MetaData>
 <AllFeeds>
   <FeedContent>
      <Id> FeedContentId </Id>
   </FeedContent>
 </AllFeeds>
</PFeed>
但是,我没有输出
FeedContentId
,而是得到以下结果:
MyProcess 1 MyMetadataId FeedContentId


您能指出我缺少什么吗?

您首先需要一个模板来匹配根元素,然后匹配其中的内容。这个XSLT现在又可以工作了。(测试,例如打开)


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

当前XSLT代码的输出是:

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

元素的默认模板跳过元素,文本节点的默认模板复制这些文本节点,而这正是所发生的

一种解决方案是使用一个模板直接针对您感兴趣的内容(
/PFeed/allfeed/FeedContent/Id
),然后编写另一个与文本节点匹配的模板:

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


联机尝试此解决方案。

此XSLT样式表不起作用<代码>xsl:value of不能在
xsl:apply模板
内。请在将代码作为答案提交之前对其进行测试。不过,在上面指定的测试页面中,它确实有效。无论如何,由于OP使用xpath表达式,XSLT并不重要。我将添加一条注释,说明它已损坏。此代码始终处于损坏状态。如果这样做有效,XSLT的实现就不正确。永远不要相信w3schools.com上的任何东西,这里有一个可靠的选择:。
FeedContentId
MyProcess 1 MyMetadataId FeedContentId
<xsl:template match="text()"/>
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<?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