Xslt - for-each不能产生所需的"属性"在元素

时间:2017-01-20 05:58:24

标签: xml xslt xslt-1.0

尝试在xslt中使用for-each获取元素内的属性值。 有人可以帮助获得所需的输出,我只得到名称=&#34; id&#34;并输入=&#34; string&#34;对于所有<property name="id" type="string"/>

输入Xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns2:Example xmlns:ns2="http://example.com/internal">
        <inspection-result version="1">
            <form title="Form 1" history="true">
                <property name="id" type="string"/>
                <property name="name" type="string"/>
                <property name="default" type="string"/>
                <property name="time" type="string"/>
                <property name="status" type="string"/>
                <action name="click"/>
            </form>
            <next>Form2</next>
        </inspection-result>
    </ns2:Example>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ns2="http://example.com/internal"
 exclude-result-prefixes="ns2">
 <xsl:template match="inspection-result">
  <inspection-result>
   <xsl:attribute name="version"><xsl:value-of select="//inspection-result/@version"/></xsl:attribute>
   <form>
    <xsl:attribute name="title"><xsl:value-of select="//form/@title" /></xsl:attribute>
    <xsl:attribute name="history"><xsl:value-of select="//form/@history" /></xsl:attribute>
    <xsl:for-each select="//form/property">
     <property>
      <xsl:attribute name="name"><xsl:value-of select="//form/property/@name" /></xsl:attribute>
      <xsl:attribute name="type"><xsl:value-of select="//form/property/@type" /></xsl:attribute>
     </property>
    </xsl:for-each>

    <action>
     <xsl:attribute name="name"><xsl:value-of select="//action/@name" /></xsl:attribute>
    </action>
   </form>
   <next>
    <xsl:value-of select="//next" />
   </next>
  </inspection-result>
 </xsl:template>
</xsl:stylesheet>

预期产出:

<inspection-result version="1">
        <form title="Form 1" history="true">
            <property name="id" type="string"/>
            <property name="printerName" type="string"/>
            <property name="default" type="string"/>
            <property name="createdTimeStamp" type="string"/>
            <property name="status" type="string"/>
            <action name="click"/>
        </form>
        <next>Form2</next>
    </inspection-result>

1 个答案:

答案 0 :(得分:0)

由于您已经在form的上下文中,因此您需要使用其子元素的 relative 路径,例如:

<xsl:value-of select="@name" />

你现在拥有什么:

<xsl:value-of select="//form/property/@name" />

绝对路径,从根目录开始,在整个文档中选择所有 @name属性。在XSLT 1.0中,xsl:value-of指令仅返回所选节点集中第一个节点的值。

你也在其他地方过度使用//表达式。我建议你将模板重写为:

<xsl:template match="inspection-result">
    <inspection-result>
        <xsl:attribute name="version">
            <xsl:value-of select="@version"/>
        </xsl:attribute>
        <form>
        <xsl:attribute name="title">
            <xsl:value-of select="form/@title" />
        </xsl:attribute>
        <xsl:attribute name="history">
            <xsl:value-of select="form/@history" />
        </xsl:attribute>
        <xsl:for-each select="form/property">
            <property>
                <xsl:attribute name="name">
                    <xsl:value-of select="@name" />
                </xsl:attribute>
                <xsl:attribute name="type">
                    <xsl:value-of select="@type" />
                </xsl:attribute>
            </property>
        </xsl:for-each>
        <action>
            <xsl:attribute name="name">
                <xsl:value-of select="@name" />
            </xsl:attribute>
        </action>
        </form>
            <next>
                <xsl:value-of select="next" />
            </next>
    </inspection-result>
</xsl:template>