【问题标题】:Selecting XML based on Path using XSLT使用 XSLT 基于路径选择 XML
【发布时间】:2020-01-18 00:59:29
【问题描述】:

我有一个源 xml,我想根据路径进行选择,即来自第二个或第三个 xml 节点。我尝试过使用 Some XSLT 代码,但没有得到准确的输出。

输入 XML:

            <?xml version="1.0" encoding="UTF-8"?>
            <ns0:Header xmlns:ns0="http://xyz987.com">
                <Main>
                    <Parent2>
                        <Parent2>
                            <?xml version="1.0" encoding="UTF-8"?>
                            <Child1>
                                <GChild1>12</GChild1>
                                <Child2>
                                    <GChild2>12</GChild2>
                                </Child2>
                            </Child1>
                        </Parent2>
                    </Parent2>

                </Main>
            </ns0:Header>

目标 XML:

            <?xml version="1.0" encoding="UTF-8"?>
            <Child1>
                <GChild1>12</GChild1>
                <Child2>
                    <GChild2>12</GChild2>
                </Child2>
            </Child1>

尝试过 XSLT 代码:

            <?xml version="1.0" encoding="UTF-8" ?>
            <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                <xsl:output method="xml"  omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
                <xsl:strip-space elements="*"/>
                <xsl:template match="/">

                    <xsl:apply-templates select="/Header/Parent2/Parent2"/>

                </xsl:template>

                <xsl:template match="@*">
                    <xsl:copy>
                        <xsl:apply-templates select="@*"/>
                    </xsl:copy>
                </xsl:template>

                <xsl:template match="*">
                    <xsl:element name="{local-name()}">
                        <xsl:copy-of select="@*" />
                        <xsl:apply-templates />
                    </xsl:element>
                </xsl:template>

            </xsl:transform>

【问题讨论】:

  • 这真的是你的 XML,因为在 XML 文档中间有一个 &lt;?xml version="1.0" encoding="UTF-8"?&gt; 声明是无效的。它只能出现在第一行。或者,也许在您真正的 XML 中,它被包装在 CDATA 部分中,这将成为一个非常不同的问题!谢谢!
  • 您的 Header 元素在命名空间中,而您的样式表正在寻找没有命名空间中的 Header 元素。,

标签: xml xslt


【解决方案1】:
**You can try this**:

    <?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="1.0">
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates select="descendant::Parent2/Parent2/*"/>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

输出为:

<?xml version="1.0" encoding="utf-8"?>
<Child1>
   <GChild1>12</GChild1>
   <Child2>
      <GChild2>12</GChild2>
   </Child2>
</Child1>

【讨论】:

    【解决方案2】:

    这个样式表会复制/Header/Main/Parent2/Parent2下的所有子节点:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns0="http://xyz987.com">
        <xsl:output method="xml"  omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
        <xsl:strip-space elements="*"/>
    
        <xsl:template match="/">
            <xsl:copy-of select="ns0:Header/Main/Parent2/Parent2/*"/>
        </xsl:template>
    </xsl:transform>
    

    输出:

    <Child1 xmlns:ns0="http://xyz987.com">
       <GChild1>12</GChild1>
       <Child2>
          <GChild2>12</GChild2>
       </Child2>
    </Child1>
    

    【讨论】:

      【解决方案3】:

      仅检查以下代码:-

      <xsl:template match="Header">
              <xsl:copy-of select="Main/Parent2/Parent2/*"/>
      </xsl:template>
      

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 2020-11-12
        相关资源
        最近更新 更多