XSLT更改架构的结构

时间:2018-08-06 16:20:01

标签: xml xslt xsd xslt-1.0 xslt-2.0

我是XSLT的新手,正在使用XSLT 1.0或XSLT 2.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。它能够创建模式,但不能插入值

2 个答案:

答案 0 :(得分:0)

如果您有一个XML-> XML转换,而您想保留部分结构和节点,那么通常会开始使用Identity转换编写转换,在XSLT 3中,您可以通过声明<xsl:mode on-no-match="shallow-copy"/>来实现。 (https://www.w3.org/TR/xslt-30/#built-in-templates-shallow-copy),在早期版本中,您可以使用模板将其拼写出来

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

答案 1 :(得分:0)

它不太难。实际上,您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>