我有一些这样的数据(经过大量编辑)
<Chemical id="000050362" displayFormula="C17-H21-N-O4" displayName="Cocaine [BAN]">
<NameList>
<SystematicName>
Cocaine
<SourceList>
<Source>EINECS</Source>
</SourceList>
</SystematicName>
<Synonyms>
"C" Carrie
<SourceList>
<Source>HSDB</Source>
<Source>RTECS</Source>
</SourceList>
</Synonyms>
<Synonyms>
<DescriptorName>Cocaine</DescriptorName>
</NameList>
</Chemical>
我目前正在使用此XSLT将名称提取到带有URL的csv
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:variable name="FS">
<!-- Field seperator -->
<xsl:text>;</xsl:text>
</xsl:variable>
<xsl:variable name="LT">
<!-- Line terminator -->
<xsl:text> </xsl:text>
</xsl:variable>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:for-each select="//Chemical[@displayName != '' and @displayName != 'INDEX NAME NOT YET ASSIGNED']">
<xsl:call-template name="printValues">
<xsl:with-param name="val1" select="@id" />
<xsl:with-param name="val2" select="@displayName" />
</xsl:call-template>
<xsl:call-template name="printValues">
<xsl:with-param name="val1" select="@id" />
<xsl:with-param name="val2" select="normalize-space(NameList/SystematicName/text())" />
</xsl:call-template>
<xsl:call-template name="printValues">
<xsl:with-param name="val1" select="@id" />
<xsl:with-param name="val2" select="normalize-space(NameList/Synonyms/text())" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="printValues">
<xsl:param name="val1" />
<xsl:param name="val2" />
<xsl:text>"</xsl:text>
<xsl:value-of select="$val2" />
<xsl:text>"</xsl:text>
<xsl:text>,</xsl:text>
<xsl:text>"</xsl:text>https://chem.nlm.nih.gov/chemidplus/sid/startswith/<xsl:value-of select="$val1" /><xsl:text>"</xsl:text>
<xsl:text>,"nlm"</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我收到的示例输出
""C" Carrie","https://chem.nlm.nih.gov/chemidplus/sid/startswith/000050362","nlm"
我想要什么
"\"C\" Carrie","https://chem.nlm.nih.gov/chemidplus/sid/startswith/000050362","nlm"
现在当我尝试逃避双引号时,例如“C”Carrie它不起作用,我怀疑是因为我需要在一个名为的模板中调用模板?
有人可以给我一些建议吗?
答案 0 :(得分:0)
是应该在<xsl:with-param name="val2" select="normalize-space(NameList/SystematicName/text())" />
还是printvalues
内调用?
可以从任何位置调用模板。请在下面找到XSLT。我已经采取了一些自由来清理printValues
模板并将URL
和nlm
移动到常量中。
<xsl:template name="printValues">
<xsl:param name="val1" />
<xsl:param name="val2" />
<!-- constants -->
<xsl:variable name="url" select="'https://chem.nlm.nih.gov/chemidplus/sid/startswith/'" />
<xsl:variable name="src" select="'nlm'" />
<xsl:text>"</xsl:text>
<xsl:call-template name="escapeQuote">
<xsl:with-param name="paramStr" select="$val2" />
</xsl:call-template>
<xsl:text>"</xsl:text>
<xsl:text>,</xsl:text>
<xsl:text>"</xsl:text>
<xsl:value-of select="concat($url, $val1)" />
<xsl:text>"</xsl:text>
<xsl:text>,</xsl:text>
<xsl:text>"</xsl:text>
<xsl:value-of select="$src" />
<xsl:text>"</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template name="escapeQuote">
<xsl:param name="paramStr" />
<xsl:if test="string-length($paramStr) > 0">
<xsl:value-of select="substring-before(concat($paramStr, '"'), '"')" />
<xsl:if test="contains($paramStr, '"')">
<xsl:text>\"</xsl:text>
<xsl:call-template name="escapeQuote">
<xsl:with-param name="paramStr" select="substring-after($paramStr, '"')" />
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
输出
"Cocaine [BAN]","https://chem.nlm.nih.gov/chemidplus/sid/startswith/000050362","nlm"
"Cocaine","https://chem.nlm.nih.gov/chemidplus/sid/startswith/000050362","nlm"
"\"C\" Carrie","https://chem.nlm.nih.gov/chemidplus/sid/startswith/000050362","nlm"