读取XSLT中的XML文件并使用它来构造新的XML

时间:2013-05-01 18:05:23

标签: xml xslt

我想在XSLT中读取XML文件并检查其节点。如果它们与我应用转换的XML节点的值匹配,则获取XML节点的值并使用它来构造新的XML结构。

这是一个说明我的问题的例子。我想很多人可以使用这个问题来参考实现类似的功能。

Referenced.xml

<xml>
  <root>
    <Id id = "1">
      <fields>
        <field>
          <name> Name1 </name>
          <value> Val1 </value>
        </field>
        <field>
          <name> Name2 </name>
          <value> Val2 </value>
        </field>
      </fields> 
    </Id>
    <Id id = "2">
    ...
    </Id>
  </root>
</xml>

Xml.xml

<XML>
  <Fields>
   <Id id = "1">
    <F1> Value1 </F1>
    <F2> Value2 </F2>
    <F1> Value3 </F1>
    <F4> Value4 </F4>
 </Id>
  </Fields>
</XML>

现在,我想创建一个转换,它将遍历XML文件(Referenced.xml)并检查两个xml匹配内的Id,然后在该id内Name1 = F1以及它在哪里然后,获取该'name'的'value'并创建一个类似

的XML结构
<outputXml>
  <Field id="Val1">
    <val> Value1 </val>
  </Field>
  <Field id="Val2">
    <val> Value2 </val>
  </Field> ... and so on
</outputXml>

我知道我必须使用document(),但我不确定如何在xsl内部迭代Referenced.xml并使用if,else来实现所需的功能?

3 个答案:

答案 0 :(得分:6)

检查一下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="file1" select="document('Referenced.xml')"/>
  <xsl:param name="file2" select="document('Xml.xml')"/>

  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/">
    <outputXml>
      <xsl:for-each select="$file1//Id">
        <xsl:variable name="ReferencedID" select="@id"/>
        <xsl:choose>
          <xsl:when test="$ReferencedID = $file2//Id/@id">
            <xsl:for-each select="fields/field">
              <Field id="{normalize-space(value)}"><xsl:value-of select="value"/></Field>
            </xsl:for-each>
          </xsl:when>
        </xsl:choose>
      </xsl:for-each>
    </outputXml>
  </xsl:template>

</xsl:stylesheet>

获得输出:

<outputXml>
   <Field id=" Val1 "> Val1 </Field>
   <Field id=" Val2 "> Val2 </Field>
</outputXml>

答案 1 :(得分:1)

这是一段有效的代码:

<!-- loads a file like resources/strings-en.xml into a variable document-->
<xsl:variable 
    name="messages" 
    select="document(concat('resources/strings-', $lang, '.xml'))/my:strings"
/>

...

<!-- uses the loaded document for selecting -->
<xsl:template name="localized-string">
    <xsl:param name="name"/>
    <xsl:value-of select="$messages/my:string[@name=$name]"/>
</xsl:template>

正如您所看到的,一旦您将文档读入变量,它看起来像普通文档,您应用XPath表达式来遍历它等等。

答案 2 :(得分:0)

试试这个 您的XML文件 Chapters.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ditaXSL.xsl"?>
<map>
    <title>Syncro phone user guide</title>
    <topicref href="gettingStarted.dita"/>
</map>

您的XSl名称: ditaXSL.xsl

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f="Functions"
    version="2.0">
    <xsl:template match="map">
        <html>
            <title>
                <xsl:value-of select="title" />
            </title>
            <h4>
                <xsl:value-of select="title" />
            </h4>

            <body>
                <table>
                    <tr>
                        <th>TOPIC REF</th>
                    </tr>

                    <xsl:for-each select="topicref">
                        <tr>
                            <td>
                                <xsl:apply-templates select="document(@href)/topic" />
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>

        </html>
    </xsl:template>

    <xsl:template match="topic">
        <xsl:apply-templates />
    </xsl:template>


    <xsl:template match="title">
        Chapter :
        <h6>
            <xsl:value-of select="." />
        </h6>
    </xsl:template>

    <xsl:template match="body">
        Description :
        <h5>
            <xsl:value-of select="." />
        </h5>
    </xsl:template>
</xsl:stylesheet>

xml文件中提到的示例 gettingStarted.dita 文件。

<?xml version="1.0" encoding="UTF-8"?>
<topic>
  <title>Getting started</title>
  <body>This is introduction</body>
</topic>