XML 到 XSLT 模式不匹配



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

 <PFeed>
  <PID> MyProcess </PID>
  <Version>1</Version>
  <MetaData>
      <Id> MyMetadataId </Id>
  </MetaData>
 <AllFeeds>
   <FeedContent>
      <Id> FeedContentId </Id>
   </FeedContent>
 </AllFeeds>
</PFeed>

我想从此 XML 中提取FeedContentId作为文本。

这是我拥有的 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" encoding="UTF-8" />
  <xsl:template match="/PFeed/AllFeeds/FeedContent">
        <xsl:value-of select="Id"/>
  </xsl:template>
</xsl:stylesheet>

但是我没有输出FeedContentId而是得到以下内容: MyProcess 1 MyMetadataId FeedContentId

你能指出我错过了什么吗?

您首先需要一个模板来匹配根元素,然后匹配其中的内容。此 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 表达式来实现。

当前 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 

在此处在线试用此解决方案。

相关内容

  • 没有找到相关文章

最新更新