【问题标题】:XSLT Transformating XML to XMLXSLT 将 XML 转换为 XML
【发布时间】:2017-02-07 14:50:55
【问题描述】:

我遇到了 xslt 的问题。如何准确地使用模板来构建这样的输出?我已经厌倦了很长时间,并且使用标签xmlns是有问题的

<?xml version="1.0" encoding="utf-8"?>
<books xmlns="http://example.net/books/1.0" xmlns:a="http://example.net/author/1.0">
    <book>
        <a:author>
            <a:name>John</a:name>
            <a:surname>Applesed</a:surname>
        </a:author>
        <title>Missing opportunity</title>
    </book>
    <book>
        <a:author>
            <a:name>Paul</a:name>
            <a:surname>Morgan</a:surname>
        </a:author>
        <title>Test Book</title>
    </book>
</books>

到目前为止,我能够做这样的事情:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b="http://example.net/library/1.0" >
    <xsl:template match="/">
        <books>
            <xsl:for-each select="b:library/b:books/b:book">
                <book>
                    <author>
                        <name>
                            <xsl:value-of select="../../b:authors/b:author/b:name"/>
                        </name>
                        <surname>
                            <xsl:value-of select="../../b:authors/b:author/b:surname"/>
                        </surname>
                    </author>
                    <title>
                        <xsl:value-of select="b:title"/>
                    </title>
                </book>
            </xsl:for-each>
        </books>
    </xsl:template>

</xsl:stylesheet>

起始文件是: 无法编辑此文件

<?xml version="1.0" encoding="utf-8"?>
<library xmlns="http://example.net/library/1.0">
    <authors>
        <author id="a1">
            <name>John</name>
            <surname>Applesed</surname>
            <born>1979-11-11</born>
        </author>
        <author id="a2">
            <name>Chris</name>
            <surname>Pattern</surname>
            <born>1965-12-12</born>
        </author>
        <author id="a3">
            <name>Paulo</name>
            <surname>Coelho</surname>
            <born>1915-06-17</born>
        </author>
        <author id="a4">
            <name>Paul</name>
            <surname>Morgan</surname>
            <born>1473-02-19</born>
            <died>1543-05-24</died>
        </author>
    </authors>
    <books>
        <book id="b1" author-id="a1">
            <title>Missing opportunity</title>
            <published>1992</published>
            <isbn>978-3-16-148410-0</isbn>
        </book>
        <book id="b2" author-id="a4">
            <title>Test Book</title>
            <published>1543</published>
        </book>
    </books>
</library>

【问题讨论】:

  • 我已经回滚了你的问题,因为没有输入 XML 就没有意义。

标签: xml xslt xml-parsing transform


【解决方案1】:

在准备输出记录时,您没有限制您的作者。 ../.. 在这种情况下也无用。使用类似的东西

<xsl:value-of select="//b:authors[@id = ./@author-id ]/b:author/b:name"/>

【讨论】:

    【解决方案2】:

    试试这个方法:

    XSLT1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:b="http://example.net/library/1.0" 
    xmlns:a="http://example.net/author/1.0"
    exclude-result-prefixes="b">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="author" match="b:author" use="@id" />
    
    <xsl:template match="/b:library">
        <books xmlns="http://example.net/books/1.0">
            <xsl:for-each select="b:books/b:book">  
                <xsl:variable name="author" select="key('author', @author-id)" />
                <book>
                    <a:author>
                        <a:name>
                            <xsl:value-of select="$author/b:name"/>
                        </a:name>
                        <a:surname>
                            <xsl:value-of select="$author/b:surname"/>
                        </a:surname>
                    </a:author>
                    <title>
                        <xsl:value-of select="b:title"/>
                    </title>
                </book> 
            </xsl:for-each>
        </books>
    </xsl:template>
    
    </xsl:stylesheet>
    

    注意使用 key 来解决对作者的交叉引用。这与命名空间问题无关,但这样更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2019-12-05
      • 2012-11-24
      • 2019-04-11
      相关资源
      最近更新 更多