Xml XSLT更改模式的结构

Xml XSLT更改模式的结构,xml,xslt,xsd,xslt-1.0,xslt-2.0,Xml,Xslt,Xsd,Xslt 1.0,Xslt 2.0,我是XSLT新手,希望使用XSLT1.0或XSLT2.0更改模式 源XML: <ABC> <AB> <A> <String>123</String> <Valid>true</Valid> </A> <B> <String/> <Valid>false</Valid>

我是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>

123
符合事实的
错误的
12345
符合事实的
1234567
符合事实的
"

目标XML:

<ABC>
    <AB>
        <A>123></A>
        </B> 
        <C>12345</C>
        <D>1234567</D>
    </AB>
</ABC>

123>
12345
1234567
请注意:
是一个重复元素。请帮我解决这个问题

<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转换,其中要保留部分结构和节点,那么您通常使用标识转换开始编写转换,在XSLT 3中,您可以通过声明,在早期版本中,您可以使用模板将其拼写出来

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
这是一个在线示例

当然,根据您的需要或确切要求,您可以编写其他或更具体的模板,例如

<xsl:template match="AB/C">
  <xsl:copy>
    <xsl:value-of select="Int64"/>
  </xsl:copy>
</xsl:template>

这不太难。实际上,您无法打印这些值。您可以选择以下代码:

<?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>


您认为“67”来自哪里?对不起,这是输入中的一个输入错误。。值为“1234567”,您至少应该提供一个伪算法来理解从输入到输出xml的过程。请阅读并提出正确的问题。Thanks@baptistemm对不起,要求是。。我得到的是XML字符串中的源XML,为了映射到下游系统,我需要将源XML转换为目标XML以进行映射。我知道这不是代码编写服务。我所问的只是建议或方法。不完全是XSLT。
<?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>