无法使用xsl:when将true / false转换为1/0

时间:2015-01-29 22:53:00

标签: xml xslt xslt-1.0

我正在尝试使用XSL将XML属性转换为&#34; true&#34; /&#34; false&#34;至&#34; 1&#34; /&#34; 0&#34;的值,但我无法进行转换。通过在线阅读,我应该能够使用<xsl:when><xsl:if>来完成此任务。有些引用将我的属性包装在string中,有些则没有。

以XML为例:

<root>
  <record name="a" isMutable="true">
  <record name="b" isMutable="false">
</root>

示例XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet>
  <xsl:template match="root">
    <top>
      <xsl:apply-templates select="/root/record"/>
    </top>
  </xsl:template>
  <xsl:template match="/root/record">
    <xsl:element name="element">
      <xsl:choose>
        <xsl:when test="string(@isMutable) = 'true'">
          <xsl:attribute name="when_value">1</xsl:attribute>
        </xsl:when>
        <xsl:when test="string(@isMutable) = 'false'">
          <xsl:attribute name="when_value">0</xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:attribute name="plain_value"><xsl:value-of select="@isMutable"/></xsl:attribute>
          <xsl:attribute name="bool_value"><xsl:value-of select="boolean(@isMutable = 'true')"/></xsl:attribute>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

我希望获得when_value="0"when_value="1"的属性,而不是:

<top>
  <element plain_value="true" bool_value=""/>
  <element plain_value="false" bool_value=""/>
</top>

我可以在plain_value属性中看到我的属性值被拾取了。我还尝试了一种尝试使用boolean的替代解决方案,但您可以看到这会产生空白结果。任何人都可以在我的示例XSL代码中指出我的语法错误?谢谢。

2 个答案:

答案 0 :(得分:2)

我无法理解你想要的确切输出。看看以下样式表是否有帮助:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <top>
        <xsl:apply-templates select="record"/>
    </top>
</xsl:template>

<xsl:template match="record">
    <element name="{@name}" boolean_value="{@isMutable}" numeric_value="{number(@isMutable='true')}"/>
</xsl:template>

</xsl:stylesheet>

应用于格式良好的(!)测试输入

<root>
  <record name="a" isMutable="true"/>
  <record name="b" isMutable="false"/>
</root>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<top>
   <element name="a" boolean_value="true" numeric_value="1"/>
   <element name="b" boolean_value="false" numeric_value="0"/>
</top>

正如您所看到的,boolean_value属性的值是从原始isMutable属性复制的,而numeric_value属性则显示转换为数字的相同值 - 或者1或者0


为了完整起见,如果您想使用xsl:choose,以下是如何做同样的事情:

<xsl:template match="record">
    <element name="{@name}" boolean_value="{@isMutable}">
        <xsl:attribute name="numeric_value">
            <xsl:choose>
                <xsl:when test="@isMutable='true'">1</xsl:when>
                <xsl:otherwise>0</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
    </element>
</xsl:template>

答案 1 :(得分:0)

你的XSLT比它需要的要复杂得多(尽管从它的外观来看,应该工作,除了缺少的命名空间)。

这就是你所需要的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@isMutable">
    <xsl:attribute name="when_value">
      <xsl:value-of select="number(. = 'true')"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

或者,如果您想处理@isMutable可能不是truefalse的情况:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@isMutable[. = 'true' or . = 'false']">
    <xsl:attribute name="when_value">
      <xsl:value-of select="number(. = 'true')"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@isMutable">
     <xsl:attribute name="plain_value">
       <xsl:value-of select="." />
     </xsl:attribute>
     <xsl:attribute name="bool_value">
       <xsl:value-of select=". = 'true'" />
     </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>