正确的xsl模板匹配语法

时间:2015-09-11 04:29:44

标签: xslt

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

$ 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>

这是我使用的XSL:

stress_20150910_20150910_160259    EVALUATED
imm_20150910_20150910_140315       ACTIVE,EVALUATED

我期待的结果是:

{{1}}

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

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

2 个答案:

答案 0 :(得分:1)

怎么样......

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:a="http://www.algorithmics.com/schema"
  version="1.0" >

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

<xsl:template match="@*|node()" />

<xsl:template match="/">
  <xsl:apply-templates select="a:listDatasetsResponse/a:datasets/a:dataset" />
</xsl:template>

<xsl:template match="a:dataset">
  <xsl:value-of select="a:id"/>
  <xsl:text>&#x9;</xsl:text>
  <xsl:apply-templates select="a:active|a:stopped|a:evaluated" />
  <xsl:text>&#x0A;</xsl:text>
</xsl:template>

<xsl:template match="a:active[.='true']">
  <xsl:if test="preceding-sibling::a:active[.='true']|
                preceding-sibling::a:stopped[.='true']|
                preceding-sibling::a:evaluated[.='true']">,</xsl:if>
  <xsl:text>ACTIVE</xsl:text>
</xsl:template>

<xsl:template match="a:stopped[.='true']">
  <xsl:if test="preceding-sibling::a:active[.='true']|
                preceding-sibling::a:stopped[.='true']|
                preceding-sibling::a:evaluated[.='true']">,</xsl:if>
  <xsl:text>STOPPED</xsl:text>
</xsl:template>

<xsl:template match="a:evaluated[.='true']">
  <xsl:if test="preceding-sibling::a:active[.='true']|
                preceding-sibling::a:stopped[.='true']|
                preceding-sibling::a:evaluated[.='true']">,</xsl:if>
  <xsl:text>EVALUATED</xsl:text>
</xsl:template>

</xsl:stylesheet>

...或此版本......

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:a="http://www.algorithmics.com/schema"
  version="1.0" >

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

<xsl:template match="@*|node()" />

<xsl:template match="/">
  <xsl:apply-templates select="a:listDatasetsResponse/a:datasets/a:dataset" />
</xsl:template>

<xsl:template match="a:dataset">
  <xsl:value-of select="a:id"/>
  <xsl:text>&#x9;</xsl:text>
  <xsl:apply-templates select="a:active|a:stopped|a:evaluated" />
  <xsl:text>&#x0A;</xsl:text>
</xsl:template>

<xsl:template match="a:active[.='true'] | a:stopped[.='true'] | a:evaluated[.='true']">
  <xsl:if test="preceding-sibling::a:active[.='true']|
                preceding-sibling::a:stopped[.='true']|
                preceding-sibling::a:evaluated[.='true']">,</xsl:if>
  <xsl:value-of select="translate( local-name(), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

XSL中的基本问题是没有使用的XPath表达式与源XML中的元素匹配。请注意,您的XML在根元素处声明了默认名称空间:

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

没有显式前缀且没有本地默认名称空间的后代元素会隐式继承祖先默认名称空间。要匹配命名空间中的元素,只需声明一个指向namespace-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>