XML XSLT 模式不匹配
XML to XSLT pattern doesn't match
我正在使用 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
在线尝试此解决方案 here。
我正在使用 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
在线尝试此解决方案 here。