我有一个XSLT 1.0样式表,如果该元素存在,则需要输出特定元素的值,如果不存在,则输出字符串“NULL”。我怎样才能做到这一点?
我正在使用的文档看起来像这样:
<kanjidic2>
<header>
<file_version>4</file_version>
<database_version>2010-325</database_version>
<date_of_creation>2010-11-20</date_of_creation>
</header>
<character>
<literal>亜</literal>
<codepoint>
<cp_value cp_type="ucs">4e9c</cp_value>
<cp_value cp_type="jis208">16-01</cp_value>
</codepoint>
</character>
<character>
<literal></literal>
<codepoint>
<cp_value cp_type="ucs">226F3</cp_value>
<cp_value cp_type="jis213">2-12-48</cp_value>
</codepoint>
</character>
<!-- Plus a few thousand more <character>s -->
</kanjidic2>
我正在编写一个XSLT样式表,将上述内容转换为一系列MySQL查询。最初我想输出NULL,如果该字符没有与之关联的jis208代码点(因此我的初始问题),产生这样的查询:
INSERT INTO `kanji` (`literal`, `ucs`, `jis208`, ...) VALUES ('亜', '4e9c', '16-01', ...);
INSERT INTO `kanji` (`literal`, `ucs`, `jis208`, ...) VALUES (', '226F3', NULL, ...);
我已经意识到我可以简化XSLT并生成更短的查询:
INSERT INTO `kanji` (`literal`, `ucs`, `jis208`, ...) VALUES ('亜', '4e9c', '16-01', ...);
INSERT INTO `kanji` (`literal`, `ucs`, `jis213`, ...) VALUES ('', '226F3', '2-12-48', ...);
<?xml version="1.0" encoding="UTF-8"?>
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
<output method="text" encoding="UTF-8"/>
<template match="/">
<apply-templates select="kanjidic2/character"/>
</template>
<template match="/kanjidic2/character">
<text>INSERT INTO `kanji` (`literal`</text>
<apply-templates select="codepoint/cp_value" mode="first"/>
<text>) VALUES ('</text>
<value-of select="literal"/>
<apply-templates select="codepoint/cp_value" mode="second"/>
<text>); </text>
</template>
<template match="/kanjidic2/character/codepoint/cp_value" mode="first">
<text>, `</text>
<value-of select="@cp_type"/>
<text>`</text>
</template>
<template match="/kanjidic2/character/codepoint/cp_value" mode="second">
<text>, '</text>
<value-of select="."/>
<text>'</text>
</template>
</stylesheet>
我会将Dimitre Novatchev的答案标记为正确答案,因为它是我初始问题的最简洁解决方案。
感谢您的帮助。
答案 0 :(得分:2)
假设给定文档中只有零个或一个匹配,但它们可能位于该文档中的任何位置,以下内容可能会执行您所追求的内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:choose>
<xsl:when test="//myelement[@myattribute = 'avalue']"><xsl:value-of select="//myelement[@myattribute = 'avalue']"/></xsl:when>
<xsl:otherwise>NULL</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
如果它们总是位于文档中的特定点,则可以通过将“myelement”路径中的“//”更改为正确的路径来提高上述效率。
答案 1 :(得分:1)
<xsl:if test="count(myelement[@myattribute = 'avalue']) = 0">
NULL
</xsl:if>
<xsl:if test="count(myelement[@myattribute = 'avalue']) > 0">
<xsl:value-of select="myelement" />
</xsl:if>
答案 2 :(得分:1)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pDefault">NULL</xsl:param>
<xsl:variable name="vDefault" select=
"document('')/*/xsl:param[@name='pDefault']"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="/">
<xsl:value-of select=
"concat(//myelement[@myattribute='avalue'],
$vDefault[not($vDoc/*/myelement[@myattribute='avalue'])]
)"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<mydoc>
<myelement myattribute="avalue">Some text</myelement>
<myelement myattribute="anothervalue">Some more text</myelement>
</mydoc>
生成想要的正确结果:
Some text
应用于此XML文档:
<mydoc>
<myelement myattribute="anothervalue">Some more text</myelement>
</mydoc>
再次生成想要的正确结果:
NULL
请注意:
根本不使用条件指示(<xsl:if>
或<xsl:choose>
/ <xsl:when>
/ <xsl:otherwise>
)。