【问题标题】:XSLT -> Not getting blanks between attributesXSLT -> 属性之间没有空格
【发布时间】:2014-05-11 20:27:21
【问题描述】:

从昨天开始,我就在试验 XSLT,经过一番努力,我终于可以完成我的任务了。这包括获取“ATTRIBUTE”节点下的一些元素,并将它们自己转换为父元素的属性(顺便说一下,父元素可以有不同的名称)。这是我需要做的一个例子:

从这里->

<INVENTORY>
  <ITEM>
    <ATTRIBUTES>
      <SERIALNUMBER>something1</SERIALNUMBER>
      <LOCATION>something2</LOCATION>
      <BARCODE>something3</BARCODE>
    </ATTRIBUTES>
  Some Item Value
  </ITEM>
</INVENTORY>

到这里->

<INVENTORY>
    <ITEM SERIALNUMBER="something1" LOCATION="something2" BARCODE="something3">
    SomeItemValue
    </ITEM>
</INVENTORY>

然而,看起来很奇怪,我在父节点中获取属性,但没有任何分隔或空格。我尝试了好几件事,但似乎都没有。

这是我用来进行转换的 XSLT 模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output encoding="us-ascii"/>

    <xsl:template match="@*|node()">

        <xsl:copy>
            <xsl:if test="ATTRIBUTES">

                <xsl:for-each select="ATTRIBUTES/*">
                    <xsl:attribute name="{name()}" separator=" ">
                        <xsl:value-of select="." />
                    </xsl:attribute>
                </xsl:for-each>

            </xsl:if>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>

    </xsl:template>

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

</xsl:stylesheet>

我得到的输出如下:

<?xmlversion="1.0"encoding="us-ascii"?><INVENTORY><ITEMSERIALNUMBER="something1"LOCATION="something2"BARCODE="something3">SomeItemValue</ITEM></INVENTORY>

但是,如果尝试在 xsl:for-each 中放置 &lt;xml:text&gt; &lt;/xml:text&gt;,我会立即停止查看属性,而不是看到空格。

感谢任何帮助!

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    即使 xslt 模板中的属性分隔符无效,它在 MS Visual Studio 2013 中也能正常工作。

    试试这个

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output encoding="us-ascii" indent="yes" method="xml"/>
    
      <xsl:template match="@*|node()">
    
        <xsl:copy>
          <xsl:if test="ATTRIBUTES">
    
            <xsl:for-each select="ATTRIBUTES/*">
              <xsl:attribute name="{name()}">
                <xsl:value-of select="." />
              </xsl:attribute>
            </xsl:for-each>
    
          </xsl:if>
          <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    
      </xsl:template>
    
    
      <xsl:template match="ATTRIBUTES">
      </xsl:template>
    
    </xsl:stylesheet>
    

    改变:

    <xsl:output encoding="us-ascii" indent="yes" method="xml"/>
    <xsl:attribute name="{name()}">
    

    【讨论】:

    • 谢谢雅罗斯拉夫。事实上,我重新检查了所有代码,并没有发现转换有任何问题。空白正在被其他一些过程剥离。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2011-11-08
    • 2018-11-23
    相关资源
    最近更新 更多