xslt - 正确的 xsl 模板匹配语法

标签 xslt

我正在学习XSL,希望得到一些帮助。我想提取以下 datasets.xml 的一部分并将它们输出为制表符分隔的文本:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<listDatasetsResponse xmlns="http://www.algorithmics.com/schema">
        <status>OK</status>
        <datasets size="31">
            <dataset>
                <id>stress_20150910_20150910_160259</id>
                <basedOn>Mimm_20150910_20150910_030922</basedOn>
                <active>false</active>
                <sandbox>true</sandbox>
                <ownedBy>admin</ownedBy>
                <createdOn>2015-09-10T16:04:24.199-04:00</createdOn>
                <createdBy>rtcesupp</createdBy>
                <evaluated>true</evaluated>
                <stopped>false</stopped>
            </dataset>
            <dataset>
                <id>imm_20150910_20150910_140315</id>
                <basedOn>Mimm_20150910_20150910_030922</basedOn>
                <active>true</active>
                <sandbox>true</sandbox>
                <ownedBy>admin</ownedBy>
                <createdOn>2015-09-10T14:04:42.696-04:00</createdOn>
                <createdBy>rtcesupp</createdBy>
                <evaluated>true</evaluated>
                <stopped>false</stopped>
            </dataset>
        </datasets>
</listDatasetsResponse>

这是我使用的 XSL:

$ vi dataset.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text" encoding="iso-8859-1"/>
        <xsl:strip-space elements="*" />

         <xsl:template match="/listDatasetsResponse/datasets/dataset">
          <xsl:value-of select="id"/><xsl:text>&#x9;</xsl:text>
          <xsl:choose>
            <xsl:when test="active='true'">
                     <xsl:text>ACTIVE</xsl:text>
            </xsl:when>
            <xsl:when test="stopped='true'">
                     <xsl:text>,STOPPED</xsl:text>
            </xsl:when>
            <xsl:when test="evaluated='true'">
                     <xsl:text>,EVALUATED</xsl:text>
            </xsl:when>
          </xsl:choose>
          <xsl:text>&#xa;</xsl:text>
        </xsl:template>
</xsl:stylesheet>

我期望的结果是:

stress_20150910_20150910_160259    EVALUATED
imm_20150910_20150910_140315       ACTIVE,EVALUATED

但我得到的是: OKstress_20150910_20150910_160259Mimm_20150910_20150910_030922falsetrueadmin2015-09-10T16:04:24.199-04:00rtcesupptruefalseimm_20150910_20150910_140315Mimm_20 150910_20150910_030922truetrueadmin2015-09-10T14:04:42.696-04:00rtcesupptruefalse

XSL 样式表似乎被忽略了。有人可以指出我纠正 XSL 模板匹配语法吗?

最佳答案

XSL 中的根本问题是所使用的 XPath 表达式都不与源 XML 中的元素匹配。请注意,您的 XML 在根元素处声明了默认 namespace :

xmlns="http://www.algorithmics.com/schema"

没有显式前缀且没有本地默认命名空间的后代元素隐式继承祖先默认命名空间。要匹配命名空间中的元素,只需声明一个指向命名空间 uri 的前缀并在 XPath 表达式中使用该前缀,例如:

<xsl:stylesheet .....
    xmlns:d="http://www.algorithmics.com/schema">
    .....
    <xsl:template match="/d:listDatasetsResponse/d:datasets/d:dataset">
        <xsl:value-of select="d:id"/><xsl:text>&#x9;</xsl:text>
        .....
    </xsl:template>
</xsl:stylesheet>

关于xslt - 正确的 xsl 模板匹配语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32515482/

相关文章:

string - 在 XSLT 1.0 中将字符串转换为整数

javascript - 如何使用 Greasemonkey 设计 XML 片段的样式?

XSLT 命名空间和解析硬编码前缀

xml - XSLT 运行速度太慢

xml - XSLT 转换替换在文档中定期出现的标记

javascript - 我如何使用 XML 设计样式

xslt - 使用 XSLT 的多个键上的不同节点

visual-studio-2010 - Web.config 转换 - 缺少的手册

xml - 选择两个节点之间的所有 sibling (不包括 sibling )

xslt - 从 XML 元素中删除空格