xslt - XSLT 元素到新元素中的属性
问题描述
我能够从元素转换为属性并将它们放入一个新元素中,但是父元素会为每个子元素重复。
xml:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<number>4884624</number>
<unit>EA</unit>
<qty>6</qty>
<barcode/>
<conversion/>
</items>
<items>
<number>4895036</number>
<unit>CS</unit>
<qty>4</qty>
<barcode/>
<conversion/>
</items>
<items>
<number/>
<unit>CS</unit>
<qty>4</qty>
<barcode/>
<conversion/>
</items>
</transaction>
</root>
Xslt:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/ | node() | @* | comment() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="items">
<xsl:copy>
<item>
<xsl:for-each select="*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
</item>
</xsl:copy>
</xsl:template>
</xsl:transform>
电流输出:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<item number="4884624" unit="EA" qty="6" barcode="" conversion=""/>
</items>
<items>
<item number="4895036" unit="CS" qty="4" barcode="" conversion=""/>
</items>
<items>
<item number="" unit="CS" qty="4" barcode="" conversion=""/>
</items>
</transaction>
</root>
期望的输出:
<root>
<function>test</function>
<transaction>
<date>2019-09-24</date>
<user>myuser</user>
<items>
<item number="4884624" unit="EA" qty="6" barcode="" conversion=""/>
<item number="4895036" unit="CS" qty="4" barcode="" conversion=""/>
<item number="" unit="CS" qty="4" barcode="" conversion=""/>
</items>
</transaction>
</root>
解决方案
尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="transaction">
<xsl:copy>
<xsl:apply-templates select="*[not(self::items)]"/>
<items>
<xsl:apply-templates select="items"/>
</items>
</xsl:copy>
</xsl:template>
<xsl:template match="items">
<item>
<xsl:apply-templates/>
</item>
</xsl:template>
<xsl:template match="items/*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- google-chrome - 会话存储未结转到 Chrome 89+ 中的新标签页
- python - 为什么当我尝试在项目解释器中安装任何库时,PyCharm 会说“无法获取 URL https://pypi.org/simple/pip/: ...”?
- spring - 多个 @Before/@After 与 Cucumber 和 Spring?
- reactjs - 在 React 中更新状态数组
- reactjs - nextjs 路由器更新 URL 参数更改
- javascript - 无法调用 JS 函数,在控制台日志上显示错误
- html - 如果用于标记外语单词,-tag 是否应该包含语言属性?
- php - PHP:如何从 Livehealth Webhook API 捕获数据
- javascript - 尝试绘制没有重复的数据
- flutter - 我如何开启未来
- 从 Firestore 到 Flutter 的小部件?