1

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

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

引用的.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>

Referenced.xml现在,我想创建一个转换,Name1 = F1它将遍历 XML 文件(XML 结构,如

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

我知道我必须使用document(),但我不确定您如何遍历Referenced.xml内部 xsl 并使用 if,否则以实现所需的功能?

4

3 回答 3

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>
于 2013-05-02T06:14:07.410 回答
3

这是一段工作代码:

<!-- 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 表达式来遍历它,等等。

于 2013-05-01T18:31:06.733 回答
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>
于 2013-07-25T10:40:03.373 回答