如何 select 只有顶级标签?
How to select only top level tags?
我有一个 xml 文件:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account>L01+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.0000</Accruedint>
<ComisClear>0.0000</ComisClear>
</value>
<value>
<Account>1231+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.12300</Accruedint>
<ComisClear>0.012300</ComisClear>
</value>
</result>
我想在 标签上包装所有值深度值标签。
现在我尝试这样做:
<xsl:template match="/">
<response>
<xsl:apply-templates select="response"/>
</response>
</xsl:template>
<xsl:template match="response">
<xsl:for-each select="*">
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(*,1,3)"/>
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:for-each>
<xsl:apply-templates select="value"/>
</xsl:template>
<xsl:template match="value">
<xsl:element name="value">
<xsl:apply-templates select="*"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(*,1,3)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="current()"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
</xsl:template>
例外 XML:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account><![CDATA[L01+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.0000]]></Accruedint>
<ComisClear><![CDATA[0.0000]]></ComisClear>
</value>
<value>
<Account><![CDATA[1231+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.12300]]></Accruedint>
<ComisClear><![CDATA[0.012300]]></ComisClear>
</value>
值标签中的数据总是不同(我每次都生成自定义文件)
但是我在 上遇到了问题,因为它包括所有节点,所以我如何才能在顶级标签上进行 foreach??
请尝试以下解决方案。
它使用所谓的 Identity Transform 模式和 cdata-section-elements
属性来为 CData 部分征集所有需要的元素。
cdata-section-elements
属性是 XSLT 标准的一个 built-in 功能,用于添加 CData 部分。
XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" cdata-section-elements="Account SecurCode Accruedint ComisClear"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value/*">
<xsl:copy>
<xsl:value-of select="substring(*,1,3)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="current()"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
我有一个 xml 文件:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account>L01+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.0000</Accruedint>
<ComisClear>0.0000</ComisClear>
</value>
<value>
<Account>1231+00000F00</Account>
<SecurCode>RU000A1017H9</SecurCode>
<Accruedint>0.12300</Accruedint>
<ComisClear>0.012300</ComisClear>
</value>
</result>
我想在 标签上包装所有值深度值标签。 现在我尝试这样做:
<xsl:template match="/">
<response>
<xsl:apply-templates select="response"/>
</response>
</xsl:template>
<xsl:template match="response">
<xsl:for-each select="*">
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(*,1,3)"/>
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:for-each>
<xsl:apply-templates select="value"/>
</xsl:template>
<xsl:template match="value">
<xsl:element name="value">
<xsl:apply-templates select="*"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(*,1,3)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="current()"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:element>
</xsl:template>
例外 XML:
<response>
<ERROR_CODE>0</ERROR_CODE>
<result>
<value>
<Account><![CDATA[L01+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.0000]]></Accruedint>
<ComisClear><![CDATA[0.0000]]></ComisClear>
</value>
<value>
<Account><![CDATA[1231+00000F00]]></Account>
<SecurCode><![CDATA[RU000A1017H9]]></SecurCode>
<Accruedint><![CDATA[0.12300]]></Accruedint>
<ComisClear><![CDATA[0.012300]]></ComisClear>
</value>
值标签中的数据总是不同(我每次都生成自定义文件)
但是我在
请尝试以下解决方案。
它使用所谓的 Identity Transform 模式和 cdata-section-elements
属性来为 CData 部分征集所有需要的元素。
cdata-section-elements
属性是 XSLT 标准的一个 built-in 功能,用于添加 CData 部分。
XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" cdata-section-elements="Account SecurCode Accruedint ComisClear"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value/*">
<xsl:copy>
<xsl:value-of select="substring(*,1,3)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="current()"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>