2013-05-01 46 views
0

我想读取XSLT中的XML文件并检查其节点。如果它们与我正在应用该转换的XML节点的值匹配,那么获取XML节点的值并使用它来构造新的XML结构。读取XSLT中的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)迭代,并检查其中Id在这两个XML的匹配,然后,在该ID内,Name1 = F1和无论它在哪里,获取'价值'的'名称',并创建一个XML结构像

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

我知道我必须使用document(),但我不知道你是怎么通过Referenced.xml迭代里面XSL和使用,如果,否则,以实现所需的功能?

+0

您的XML格式错误,无效。请提供有效的XML。 – 2013-05-01 18:08:15

+0

已添加。忘了添加引号。再次检查 – user2334314 2013-05-01 18:11:38

+0

对不起,它仍然格式不正确。您需要指定一个属性名称,例如 2013-05-01 18:13:12

回答

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

5

检查这一项:

<?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> 
+0

您的代码有效,但唯一的问题是Xml.xml不是新文件,而是其应用XSL转换的文件。你可以修改你的代码,以便我接受你的答案。 – user2334314 2013-05-02 18:07:08

+0

同样在输出中我想要Value1和Value2而不是Val1和Val2 :) – user2334314 2013-05-02 18:28:09

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> 

gettingStarted.dita xml文件中提到文件。

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