xslt在参数中转义双引号

时间:2017-11-09 01:40:09

标签: xslt

我有一些这样的数据(经过大量编辑)

<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>&#10;</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>&#34;</xsl:text>
    <xsl:value-of select="$val2" />
    <xsl:text>&#34;</xsl:text>

    <xsl:text>&#44;</xsl:text>
    <xsl:text>&#34;</xsl:text>https://chem.nlm.nih.gov/chemidplus/sid/startswith/<xsl:value-of select="$val1" /><xsl:text>&#34;</xsl:text>
    <xsl:text>&#44;&#34;nlm&#34;</xsl:text>
    <xsl:text>&#10;</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它不起作用,我怀疑是因为我需要在一个名为的模板中调用模板?

有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

是应该在<xsl:with-param name="val2" select="normalize-space(NameList/SystematicName/text())" />还是printvalues内调用?

可以从任何位置调用模板。请在下面找到XSLT。我已经采取了一些自由来清理printValues模板并将URLnlm移动到常量中。

<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>&#34;</xsl:text>
    <xsl:call-template name="escapeQuote">
        <xsl:with-param name="paramStr" select="$val2" />
    </xsl:call-template>
    <xsl:text>&#34;</xsl:text>

    <xsl:text>&#44;</xsl:text>
    <xsl:text>&#34;</xsl:text>
    <xsl:value-of select="concat($url, $val1)" />
    <xsl:text>&#34;</xsl:text>

    <xsl:text>&#44;</xsl:text>
    <xsl:text>&#34;</xsl:text>
    <xsl:value-of select="$src" />
    <xsl:text>&#34;</xsl:text>
    <xsl:text>&#10;</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, '&quot;'), '&quot;')" />
        <xsl:if test="contains($paramStr, '&quot;')">
            <xsl:text>\"</xsl:text>
            <xsl:call-template name="escapeQuote">
                <xsl:with-param name="paramStr" select="substring-after($paramStr, '&quot;')" />
            </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"