我是XSLT的新手,正在寻找使用XSLT1.0或XSLT2.0 的模式更改
源XML:
<ABC>
<AB>
<A>
<String>123</String>
<Valid>true</Valid>
</A>
<B>
<String/>
<Valid>false</Valid>
</B>
<C>
<Int64>12345</Int64>
<Valid>true</Valid>
</C>
<D>
<String>1234567</String>
<Valid>true</Valid>
</D>
</AB>
'
目标XML:
<ABC>
<AB>
<A>123></A>
</B>
<C>12345</C>
<D>1234567</D>
</AB>
</ABC>
请注意:<AB>
是一个重复元素。请帮我解决这个问题。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<ABC>
<AB>
<A><xsl:value-of select="String"/></A>
<B><xsl:value-of select="String"/></B>
<C><xsl:value-of select="Int64"/></C>
</AB>
</ABC>
</xsl:template>
</xsl:stylesheet>
这是我编写的示例XSLT。它可以创建模式,但不能插入值
如果您有一个XML->XML转换,您希望在其中保留部分结构和节点,那么您通常会使用标识转换来编写转换,在XSLT3中,您可以通过声明<xsl:mode on-no-match="shallow-copy"/>
来实现这一点(https://www.w3.org/TR/xslt-30/#built-在模板浅拷贝中(,在早期版本中,您可以使用模板拼写出来
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
在样式表中,您只需要为要转换的节点添加模板,在这种情况下,您似乎只想通过使用第一个子元素的字符串值来转换AB
元素的所有子元素:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="AB/*">
<xsl:copy>
<xsl:value-of select="*[1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gWmuiJw是一个在线示例。
当然,根据您的需求或确切要求,您可以编写其他或更具体的模板,例如
<xsl:template match="AB/C">
<xsl:copy>
<xsl:value-of select="Int64"/>
</xsl:copy>
</xsl:template>
这并不太难。实际上,XPath无法打印值。您可以选择以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AB">
<AB>
<xsl:for-each select="*">
<xsl:copy>
<xsl:value-of select="*[1]"/>
</xsl:copy>
</xsl:for-each>
</AB>
</xsl:template>
</xsl:stylesheet>