XLS选择=“$ my_parameter”不会评价为已解析的XML(XLS select=“$my

2019-09-27 17:05发布

这里是返回一个变量12 ,这是我所期望的:

    <xsl:variable name="MM">
        <xsl:value-of select="../BIRTH_MONTH"/>
    </xsl:variable>

我要立足select上的一个参数子句。 我想是这样的:

<!-- $which_date has the value "BIRTH" -->

    <xsl:variable name="MM">
        <xsl:value-of select="concat('../', $which_date, '_MONTH')"/>
    </xsl:variable>

上述返回值为../BIRTH_MONTH

我想这个问题可能与concat()但低于的是,还返回未评估结果的变种../BIRTH_MONTH

<!-- $which_date has the value "../BIRTH_MONTH" -->

    <xsl:variable name="MM">
        <xsl:value-of select="$which_date"/>
    </xsl:variable>

(插入这里的历史基础上加上引号,括号,调整数十种尝试的等...)

如何使用$which_date在表达式中可以通过计算?

Answer 1:

 <xsl:variable name="MM"> <xsl:value-of select="concat('../', $which_date, '_MONTH')"/> </xsl:variable> 

上述返回../BIRTH_MONTH的值。

你想

<xsl:variable name="MM" select="../*[name()=concat($which_date, '_MONTH')]"/>

这是一个完整的转型

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:param name="which_date" select="'BIRTH'"/>

  <xsl:template match="x">
    <xsl:variable name="MM" select=
         "../*[name()=concat($which_date, '_MONTH')]"/>
    <xsl:value-of select="$MM"/>
  </xsl:template>

  <xsl:template match="text()"/>
</xsl:stylesheet>

当这种转化是在下面的XML文档应用 (均未被设置有问题):

<t>
 <x>1</x>
 <BIRTH_MONTH>12</BIRTH_MONTH>
</t>

在想,正确的结果产生

12

更新 :根据您的其他类似的问题,我们看到,你想有一个参数化的解决方案。

这里是一个可能的解决方案参数:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pdateComponents" select="'|BIRTH_MONTH|BIRTH_DAY|BIRTH_YEAR|'"/>
 <xsl:param name="poutputDateName" select="'BIRTH_DATE'"/>

  <xsl:template match="/*">
    <xsl:apply-templates select=
     "*[*[contains($pdateComponents, concat('|',name(),'|'))]]" mode="dateHolder"/>
  </xsl:template>

  <xsl:template match="*" mode="dateHolder">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:element name="{$poutputDateName}">
        <xsl:apply-templates select=
        "*[contains($pdateComponents, concat('|',name(),'|'))]" mode="date">
          <xsl:sort select="substring-before($pdateComponents, concat('|',name(),'|'))"/>
        </xsl:apply-templates>
      </xsl:element>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*" mode="date">
    <xsl:value-of select=
         "concat(substring('/', 1 + (position() = 1)), normalize-space())"/>
  </xsl:template>
</xsl:stylesheet>

当该XSLT 1.0变换被应用在下面的XML文档

<RECORDS>
    <PERSON name="A">
        <BIRTH_YEAR> 1943 </BIRTH_YEAR>
        <BIRTH_MONTH>  04 </BIRTH_MONTH>
        <BIRTH_DAY>    01 </BIRTH_DAY>
    </PERSON>
    <PERSON name="B">
        <BIRTH_YEAR> 1957 </BIRTH_YEAR>
        <BIRTH_MONTH>  08 </BIRTH_MONTH>
        <BIRTH_DAY>    29 </BIRTH_DAY>
    </PERSON>
    <PERSON name="C">
        <BIRTH_YEAR> 1802 </BIRTH_YEAR>
        <BIRTH_MONTH>  12 </BIRTH_MONTH>
        <BIRTH_DAY>    14 </BIRTH_DAY>
    </PERSON>
    <PERSON name="D">
        <BIRTH_YEAR> 2015 </BIRTH_YEAR>
        <BIRTH_MONTH>  04 </BIRTH_MONTH>
        <BIRTH_DAY>    30 </BIRTH_DAY>
    </PERSON>
</RECORDS>

其结果是

<PERSON name="A">
   <BIRTH_DATE>04/01/1943</BIRTH_DATE>
</PERSON>
<PERSON name="B">
   <BIRTH_DATE>08/29/1957</BIRTH_DATE>
</PERSON>
<PERSON name="C">
   <BIRTH_DATE>12/14/1802</BIRTH_DATE>
</PERSON>
<PERSON name="D">
   <BIRTH_DATE>04/30/2015</BIRTH_DATE>
</PERSON>

请注意

  1. 提供在全球参数转换的日期组件的名字 - 他们不是静态已知。
  2. 输出元素包含日期的名称也作为另一个全局参数转换的价值。
  3. 连的时间组件,其使用构造日期顺序,在第一部件被设置!

因此,上述提供的参数导致美国日期输出。

但是,如果我们提供这个参数

 <xsl:param name="pdateComponents" select="'|BIRTH_DAY|BIRTH_MONTH|BIRTH_YEAR|'"/>

然后转换的结果包含在欧洲格式的日期:

<PERSON name="A">
   <BIRTH_DATE>01/04/1943</BIRTH_DATE>
</PERSON>
<PERSON name="B">
   <BIRTH_DATE>29/08/1957</BIRTH_DATE>
</PERSON>
<PERSON name="C">
   <BIRTH_DATE>14/12/1802</BIRTH_DATE>
</PERSON>
<PERSON name="D">
   <BIRTH_DATE>30/04/2015</BIRTH_DATE>
</PERSON>


文章来源: XLS select=“$my_parameter” will not evaluate as parsed XML
标签: xslt