尝试在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>
答案 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>