XSLT转换未按预期工作

时间:2015-03-11 15:21:44

标签: xml xslt

我有以下XSLT我正在努力工作

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0"/>

<xsl:template match="Sample">
<!-- Get the Sample ID once and from the Name attribute and set it to a variable -->
<xsl:variable name="SampleID" select="Sample/Name"/>

<INBOUND>



    <xsl:for-each select="Element">
    <INBOX_SAMPLE>
      <EVENT></EVENT>
      <SAMPLE_ID>'<xsl:value-of select="$SampleID"/>'</SAMPLE_ID>
      <PARAMETER_NAME>'<xsl:value-of select='substring(//ID,1,1)'/>'</PARAMETER_NAME>
      <SRESULT>'<xsl:value-of select="PPM"/>'</SRESULT>
    </INBOX_SAMPLE>
  </xsl:for-each>



</INBOUND>

</xsl:template>

</xsl:stylesheet>

以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>

<Sample>
    <Name>2015001943 7</Name>
    <AnalysisDate>3/1/2015 10:54:26 AM</AnalysisDate>
    <Element>
             <ID>Hydrogen</ID>
             <PPM>17.061</PPM>
        </Element>
    <Element>
             <ID>Nitrogen</ID>
             <PPM>21</PPM>
        </Element>
    <Element>
             <ID>Oxygen</ID>
             <PPM>312</PPM>
        </Element>
</Sample>

当我运行XSLT时,它将遍历每个元素节点,但ID不会改变。这是我得到的输出:

<?xml version="1.0" encoding="utf-8"?><INBOUND><INBOX_SAMPLE><EVENT /><SAMPLE_ID>''</SAMPLE_ID><PARAMETER_NAME>'H'</PARAMETER_NAME><SRESULT>'17.061'</SRESULT></INBOX_SAMPLE><INBOX_SAMPLE><EVENT /><SAMPLE_ID>''</SAMPLE_ID><PARAMETER_NAME>'H'</PARAMETER_NAME><SRESULT>'21'</SRESULT></INBOX_SAMPLE><INBOX_SAMPLE><EVENT /><SAMPLE_ID>''</SAMPLE_ID><PARAMETER_NAME>'H'</PARAMETER_NAME><SRESULT>'312'</SRESULT></INBOX_SAMPLE></INBOUND>

我需要帮助几个地方。正如您在输出中看到的那样,每个元素的<SRESULT>都会显示,但<PARAMETER_NAME>不会从'H'改变,我做错了什么。另外,如何为每个参数添加<SAMPLE_ID>?它只在原始XML中显示一次。

2 个答案:

答案 0 :(得分:1)

由于您的XPath不正确,因此您搜索的是Sample/Name,但您已经在Sample。变化

<xsl:variable name="SampleID" select="Sample/Name"/>

<xsl:variable name="SampleID" select="Name"/>

此外,如果您正在谈论另一条ID此行

<xsl:value-of select='substring(//ID,1,1)'/>

应改为

<xsl:value-of select='substring(ID,1,1)'/>

否则它会选择xml文档中的所有ID

答案 1 :(得分:0)

你写的地方

substring(//ID,1,1)

// ID选择整个文档中的所有ID元素。在XSLT 2.0中,将substring()应用于一组(&gt; 1)节点是一个错误;在XSLT 1.0中,它只占用集合中的第一个节点。所以当然每次都会选择第一个ID。

您需要正在处理的元素的ID,即

substring(ID, 1, 1)

无法想象为什么你认为这里需要“//”。