我正在尝试使用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代码中指出我的语法错误?谢谢。
答案 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
可能不是true
或false
的情况:
<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>