【问题标题】:xsl prints child nodes on the line below where I want itxsl 在我想要的下一行打印子节点
【发布时间】:2012-03-30 15:52:58
【问题描述】:

这是我的第一篇文章,所以我希望我能很好地呈现格式/细节。另外,我对 xml/xsl 真的很陌生,但是我已经到处寻找答案,但没有找到任何东西。我有我试图在同一行显示的所有数据,但是当我使用 xsl 文件运行 xsltproc 时,数据会在我想要的下面的行中吐出。

首先,这是我得到的输出:

$ xsltproc MyXSL.xsl MyData.xml

<?xml version="1.0"?>

Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement1,,Suspect Flag
DEFAULT2
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement2,,Suspect Flag
DEFAULT19
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement3,,Suspect Flag
DEFAULT2
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement4,,Suspect Flag
DEFAULT0

我想要的是以下内容:

Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement1,DEFAULT,2,Suspect Flag
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement2,DEFAULT,19,Suspect Flag
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement3,DEFAULT,2,Suspect Flag
Measurement Information,Time Stamp:20120315150500.0+0000,Granularity Period:300,Measurement Values,Object Instance ID,,DataElement4,DEFAULT,0,Suspect Flag

这是我正在操作的数据,我遇到问题的区域是“mdc/md/mi/mv”字段的子项,即“moid”和“r”:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="MyXSL.xsl" ?>
<mdc xmlns:HTML="http://www.w3.org/TR/REC-xml">
<md>
<mi>
    <mts>20120315150500.0+0000</mts>
    <gp>300</gp>
    <mt>DataElement1</mt>
    <mv>
        <moid>DEFAULT</moid>
        <r>2</r>
    </mv>
</mi>
<mi>
    <mts>20120315150500.0+0000</mts>
    <gp>300</gp>
    <mt>DataElement2</mt>
    <mv> 
        <moid>DEFAULT</moid> 
        <r>19</r> 
    </mv>
</mi>
<mi>
    <mts>20120315150500.0+0000</mts>
    <gp>300</gp>
    <mt>DataElement3</mt>
    <mv>
        <moid>DEFAULT</moid>
        <r>2</r>
    </mv>
</mi>
<mi>
    <mts>20120315150500.0+0000</mts>
    <gp>300</gp>
    <mt>DataElement4</mt>
    <mv>
        <moid>DEFAULT</moid>
        <r>0</r>
    </mv>
</mi>
</md>
</mdc>

这是我用来解析 xml 的 xsl 文件:

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

<xsl:strip-space elements="*"/>

<xsl:template match="/">
      <xsl:apply-templates/>
</xsl:template>

<xsl:template match="mdc">
   <xsl:apply-templates/>
</xsl:template>

<xsl:template match="md">
   <xsl:apply-templates/>
</xsl:template>

<xsl:template match="mi">
Measurement Information,Time Stamp:<xsl:value-of select="mts"/>,Granularity Period:<xsl:value-of select="gp"/>,Measurement Values,Object Instance ID,<xsl:for-each select="mt">,<xsl:value-of select="."/>,</xsl:for-each>,Suspect Flag
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="mts">
</xsl:template>

<xsl:template match="gp">
</xsl:template>

<xsl:template match="mt">
</xsl:template>

<xsl:template match="mv">
<xsl:value-of select="moid"/>
<xsl:for-each select="r">
<xsl:value-of select="."/>
</xsl:for-each>
<xsl:value-of select="sf"/>
</xsl:template>

</xsl:stylesheet>

所有文件都是通过仅适用于 unix 的文件系统创建/获取的,我通过 sed -i 's/\r//g' 运行输入来双重确保这不是由行终止字符引起的

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 仍然没有运气,但有更多信息:我尝试在“moid”和“r”周围添加 normalize-space(),但这没有用。我还通过 w3school 的 xslt tryit 编辑器验证了相同的行为
  • 它们不仅在下一行,而且也出现故障。 IE。如果它只是一个空格问题,Suspect Flag 文本将出现在DEFAULTx 文本之后。回去重新考虑一下。

标签: xml templates xslt newline


【解决方案1】:

这是一个简化的样式表,它创建您发布的输出作为想要的结果:

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

<xsl:output method="text"/>

<xsl:strip-space elements="*"/>

<xsl:template match="mi">
  <xsl:text>Measurement Information</xsl:text>
  <xsl:apply-templates select="descendant::*[not(*)]"/>
  <xsl:text>,Suspect Flag&#10;</xsl:text>
</xsl:template>

<xsl:template match="mts">
  <xsl:if test="position() > 1">
    <xsl:text>,</xsl:text>
  </xsl:if>
  <xsl:text>Time Stamp:</xsl:text><xsl:value-of select="."/>
</xsl:template>

<xsl:template match="gp">
  <xsl:if test="position() > 1">
    <xsl:text>,</xsl:text>
  </xsl:if>
  <xsl:text>Granularity Period:</xsl:text><xsl:value-of select="."/>
  <xsl:text>,Measurement Values,Object Instance ID,</xsl:text>
</xsl:template>

<xsl:template match="mt | mv/*">
  <xsl:if test="position() > 1">
    <xsl:text>,</xsl:text>
  </xsl:if>
  <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2018-11-15
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多