我有以下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中显示一次。
答案 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)
无法想象为什么你认为这里需要“//”。