0

我正在尝试编写一个 XSLT 文件,该文件将处理一个 Android Activity 布局 xml 文件并创建一个等效的 HTML。

在创建/测试 xslt 文件时,我使用的是eclipse xslt工具。

此路径上的障碍之一是许多值不是直接保存在 Android 布局文件中(例如字符串/文本值),而是保存在位于“values”文件夹中的单独 xml 文件中

我一直在尝试使用 xslt 函数 'document' 打开 strings.xml 文件,但没有成功。

  1. Q) 是否需要启用任何 Eclipse 权限才能使 xslt 文档功能运行?

  2. Q) 我对文档功能应该如何运作的理解是否有遗漏?

尝试访问 android strings.xml 文件的TextView模板(在 xslt 文件中)中包含的行是:

<xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />

  • 布局文件位于 res/layout 文件夹中
  • xslt 位于 res/xsl 文件夹中。
  • strings.xml 文件位于 res/values 文件夹中

以下是代码示例:

Android XML 布局片段

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- This is the full screen vertical layout -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"    
    android:orientation="vertical" >
    <!-- This is the main content vertical layout -->


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:paddingLeft="@dimen/mainHeadingIndent" >
        <!--  This is the Status Section Vertical content layout -->

            <TextView
                style="@style/HeadingTextStyle"
                android:id="@+id/textView2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight=".5"
                android:text="@string/Status"/>
**The rest of the layout file is intentionally omitted**

这是 XSLT 文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:android="http://schemas.android.com/apk/res/android">
    <xsl:output method="html" version="4.0" encoding="iso-8859-1"
        indent="yes" />

    <xsl:template match="/">
        <html>
            <head>
            </head>
            <body>
                <xsl:for-each select="LinearLayout">
                    <xsl:call-template name="LinearLayout">
                    </xsl:call-template>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="LinearLayout">
        <xsl:variable name="width">
            <xsl:value-of select="@android:layout_width" />
        </xsl:variable>
        <xsl:variable name="height">
            <xsl:value-of select="@android:layout_height" />
        </xsl:variable>
        <xsl:variable name="margin">
            <xsl:value-of select="@android:layout_margin" />
        </xsl:variable>
        <xsl:variable name="orient">
            <xsl:value-of select="@android:orientation" />
        </xsl:variable>
        <xsl:variable name="pos">
            <xsl:number value="position()" format="1" />
        </xsl:variable>

        <div div_pos='{$pos}' Width='{$width}' Height='{$height}' Margin='{$margin}'
            Orient='{$orient}'>
            <xsl:for-each select="LinearLayout">
                <xsl:call-template name="LinearLayout">
                </xsl:call-template>
            </xsl:for-each>
            <xsl:for-each select="TextView">
                <xsl:call-template name="TextView">
                </xsl:call-template>
            </xsl:for-each>
            <xsl:for-each select="ImageButton">
                <xsl:call-template name="ImageButton">
                </xsl:call-template>
            </xsl:for-each>
            <xsl:for-each select="Spinner">
                <xsl:call-template name="Spinner">
                </xsl:call-template>
            </xsl:for-each>
            <xsl:for-each select="Button">
                <xsl:call-template name="Button">
                </xsl:call-template>
            </xsl:for-each>
        </div>
    </xsl:template>

    <xsl:template name="ImageButton">
        <div id="{@android:id}">
            <xsl:comment>
                ImageButton
            </xsl:comment>
        </div>
    </xsl:template>

    <xsl:template name="TextView">
        <xsl:variable name="pos">
            <xsl:number value="position()" format="1" />
        </xsl:variable>
        Text field =
        <xsl:value-of select="@android:text" />
        <xsl:variable name="txt">
            <xsl:choose>
                <xsl:when test="contains(@android:text,'/')">
                    <xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />
                <!-- 
                    <xsl:value-of select="substring-after(@android:text,'/')" />
                -->
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="@android:text" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <div id="{@android:id}">
            <xsl:comment>
                TextView Element
            </xsl:comment>
            <p>
                Text pointer is: <xsl:value-of select="$txt" />
            </p>
            <!-- <p>Text pointer is:<xsl:copy-of select="$txt"/></p> <xsl:value-of 
                select="document('../values/strings.xml')/String[@name=$txt]" />
                    <xsl:value-of select="substring-after(@android:text,'/')" />
                -->
        </div>
        endoftext
        <br />
    </xsl:template>
    <xsl:template name="Spinner">
        <div id="{@android:id}">
            <xsl:comment>
                Spinner
            </xsl:comment>
        </div>
    </xsl:template>
    <xsl:template name="Button">
        <div id="{@android:id}">
            <xsl:comment>
                Button
            </xsl:comment>
        </div>
    </xsl:template>
</xsl:stylesheet>
4

2 回答 2

0

您需要在 XPath 中包含文档的根元素(这很容易忘记):

<xsl:value-of select="document('../values/strings.xml')/*/String[@name=substring-   after(@android:text,'/')]" />
于 2013-05-07T20:13:56.743 回答
0

嗯,我已经解决了。最大的问题是当 xslt 失败时,它通常会默默地失败....即没有错误

事实证明,问题本身并不是文档功能。这是遵循文档功能的选择标准。这有一个问题,即没有选定的节点,因此语句没有输出。这一切都使它看起来像文档功能不起作用。

最大的变化是 substring-after 子句没有/没有针对正确的属性进行评估。通过拆分子字符串子句,它开始工作。正如他们所说,这是“FM”(翻转魔术)!

这是我用以下内容替换文档行的内容:

<xsl:variable name='string_value'>
  <xsl:value-of select="substring-after(@android:text,'/')" />
</xsl:variable>
<xsl:value-of select="$string_value"/>
<xsl:value-of select="document('../values/strings.xml')/*/string[@name=$string_value]"/>

这成功地从 strings.xml 文件中提取了正确的值。

于 2013-05-24T23:18:14.980 回答