【问题标题】:SAS proc XSL errorSAS 过程 XSL 错误
【发布时间】:2015-07-09 18:18:09
【问题描述】:

我有一个 XML 文件,我想使用填充的 xsl 表进行转换。 SAS 有一个 Proc XSL 应该能够执行此任务,但我收到以下错误

错误:javax.xml.transform.TransformerConfigurationException:编译样式表失败。 6 检测到的错误。 错误:java.io.IOException:管道关闭

有没有其他人遇到过这样的错误?是与 SAS 相关的 java 错误还是我的 XSL 文件有问题(请参阅下面的完整文件)。``

<?xml version="1.0"?>

-<xsl:stylesheet xmlns:d7p1="http://www.w3.org/2001/XMLSchema" xmlns:d5p1="http://www.itron.com/ami/2008/10/events" xmlns:d3p1="http://www.itron.com/ami/2008/10/common" xmlns:d2p1="http://www.itron.com/ami/2008/10/data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:itron="http://schemas.datacontract.org/2004/07/Itron.Ami.AmiServiceTest.Hosting" xmlns="http://www.w3.org/TR/REC-html40" xmlns:dt="urn:schemas-microsoft-com:datatypes" xmlns:local="#local-functions" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


-<xsl:template match="/">

<div>AMI DATA</div>


-<xsl:for-each select="XMLRoot/itron:DataSubscriberItem">


-<div>

<xsl:variable select="itron:DataArrivedInput/d2p1:ReadDataCollection/d2p1:ReadData/d2p1:LoadProfileChannels/d2p1:LoadProfileChannel/d2p1:TimeDataEnd" name="EndTime"/>
Time Data End: 
<xsl:value-of select="$EndTime"/>

</div>


-<div>

<xsl:variable select="itron:DataArrivedInput/d2p1:ReadDataCollection/d2p1:ReadData/d2p1:LoadProfileChannels/d2p1:LoadProfileChannel/d2p1:PulseMultiplier" name="PulsMult"/>
Pulse Multiplier: 
<xsl:value-of select="$PulsMult"/>

</div>


-<div>
Meter ID: 
<xsl:value-of select="itron:DataArrivedInput/d2p1:ReadDataCollection/d2p1:ReadData/d2p1:Identifier"/>

</div>


-<table cellspacing="0" cellpadding="0" border="1">


-<tr style="background-color:#C0C0C0; font-weight:bold">

<td>Num</td>

<td>Vh(a)</td>

<td>Max V(a)</td>

<td>Min V(a)</td>

<td>Vh(c)</td>

<td>Max V(c)</td>

<td>Min V(c)</td>

<td>Timestamp</td>

</tr>

<xsl:variable select="count(itron:DataArrivedInput/d2p1:ReadDataCollection/d2p1:ReadData/d2p1:LoadProfileChannels/d2p1:LoadProfileChannel[1]/d2p1:IntervalValues/d2p1:IntervalValue)" name="NumPnts"/>


-<div>
Number of Points: 
<xsl:value-of select="$NumPnts"/>

</div>


-<xsl:for-each select="itron:DataArrivedInput/d2p1:ReadDataCollection/d2p1:ReadData/d2p1:LoadProfileChannels/d2p1:LoadProfileChannel[1]/d2p1:IntervalValues/d2p1:IntervalValue">

<xsl:variable select="position()" name="INum"/>

<xsl:variable select="../../d2p1:TimeDataEnd" name="EndTime2"/>


-<tr>


-<td>

<xsl:value-of select="$INum"/>

</td>

<xsl:variable select="d2p1:ChannelValue" name="Vha"/>


-<td>

<!--<xsl:value-of select="$Vha*$PulsMult"/>-->


<xsl:value-of select="format-number($Vha*$PulsMult,"0.###")"/>

</td>

<xsl:variable select="../../../d2p1:LoadProfileChannel[2]/d2p1:IntervalValues/d2p1:IntervalValue[$INum]/d2p1:ChannelValue" name="Vmaxa"/>


-<td>

<xsl:value-of select="format-number($Vmaxa*$PulsMult,"0.###")"/>

</td>

<xsl:variable select="../../../d2p1:LoadProfileChannel[3]/d2p1:IntervalValues/d2p1:IntervalValue[$INum]/d2p1:ChannelValue" name="Vmina"/>


-<td>

<xsl:value-of select="format-number($Vmina*$PulsMult,"0.###")"/>

</td>

<xsl:variable select="../../../d2p1:LoadProfileChannel[4]/d2p1:IntervalValues/d2p1:IntervalValue[$INum]/d2p1:ChannelValue" name="Vhc"/>


-<td>

<xsl:value-of select="format-number($Vhc*$PulsMult,"0.###")"/>

</td>

<xsl:variable select="../../../d2p1:LoadProfileChannel[5]/d2p1:IntervalValues/d2p1:IntervalValue[$INum]/d2p1:ChannelValue" name="Vmaxc"/>


-<td>

<xsl:value-of select="format-number($Vmaxc*$PulsMult,"0.###")"/>

</td>

<xsl:variable select="../../../d2p1:LoadProfileChannel[6]/d2p1:IntervalValues/d2p1:IntervalValue[$INum]/d2p1:ChannelValue" name="Vminc"/>


-<td>

<xsl:value-of select="format-number($Vminc*$PulsMult,"0.###")"/>

</td>


-<td>

<xsl:variable select="concat(substring($EndTime2, 1,10), ' ', substring($EndTime2, 12,5))" name="SDTS"/>

<xsl:value-of select="local:timeCalc($SDTS, $INum, $NumPnts)"/>

</td>

</tr>

</xsl:for-each>

</table>

<hr/>

</xsl:for-each>

</xsl:template>


-<msxsl:script language="VBScript" implements-prefix="local">

<![CDATA[ Function timeCalc(ET, PT, TP) SDT1 = CDate(ET) SDT = DateAdd("n", -(TP-PT)*5, SDT1) TTR = PadOut(Month(SDT)) & "/" & PadOut(Day(SDT)) & "/" & Year(SDT)& " " & PadOut(Hour(SDT)-4) & ":" & PadOut(Minute(SDT)) timeCalc = TTR End Function Function PadOut(n) If n < 10 Then PadOut = "0" & n Else PadOut = n End If End Function ]]>

</msxsl:script>

</xsl:stylesheet>

这是我的 SAS 代码

PROC XSL in='C:\SAS Files\input.XML'
    OUT='C:\SAS Files\output.XML'
    XSL='C:\SAS Files\stylesheet.xsl';
    run;

【问题讨论】:

  • 例如见this question。这意味着您的样式表中可能有错误(显然,其中有 6 个)。有可能您只是有错误,或者 SAS 不完全支持您在其中的所有内容 - 我不太清楚可以说。也许 XML 专家可以提供更有用的反馈。

标签: xml xslt sas


【解决方案1】:

在表达式中使用不同的引号。

使用

select="format-number($Vha*$PulsMult,'0.###')"

而不是

select="format-number($Vha*$PulsMult,"0.###")"

【讨论】:

  • 抱歉,数据没有从 xsl 文件正确复制过来。我在源文件中有正确的引号,只是没有正确粘贴到我的问题中。
猜你喜欢
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多