0

以下はXMLです

<?xml version="1.0" encoding="UTF-8"?>
<library>
    <object>book</object>
    <bookname>
        <value>testbook</value>
        <author>
            <value>ABCD</value>
            <category>
                <value>story</value>
                <price>
                    <dollars>200</dollars>
                </price>
            </category>
        </author>
        <author>
            <value>EFGH</value>
            <category>
                <value>fiction</value>
                <price>
                    <dollars>300</dollars>
                </price>
            </category>
        </author>
    </bookname>
</library>

以下の出力を取得するには、xpath式が必要です

<?xml version="1.0" encoding="UTF-8"?>
<library>
    <object>book</object>
    <bookname>
        <value>testbook</value>
        <author>
            <value>ABCD</value>
            <category>
                <value>story</value>
                <price>
                    <dollars>200</dollars>
                </price>
            </category>
        </author>
    </bookname>
</library>

しかし、以下のxpath式を適用すると、入力xml全体が変換された出力として取得されます。代わりに、author / value ='ABCD'に一致する親ノード+子ノードのみが必要です(上記のように)

<xsl:copy-of select="/library/object[text()='book']/../bookname/value[text()='testbook']/../author/value[text()='ABCD']/../../.."/>

目的の出力を取得するための正しいxpath式を手伝ってください。

Javaプログラムを使用してxpath式を評価し、目的のXML出力を取得しています。したがって、xpath式が必要です。以下は私のJavaコードです

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("books.xml");

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/library/object[text()='book']/../bookname/value[text()='testbook']/../author/value[text()='ABCD']/../../..");

Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;

Javaまたはxsltの正しい解決策を手伝ってください

4

1 に答える 1

2

これは、純粋な xpath では実行できません。

このスタイルシートは、XSL 2.0 で必要なことを行います

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <!-- Idendtity template -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="author[not(value eq 'ABCD')]"/>

</xsl:stylesheet>

このスタイルシートは、XSL 1.0 で必要なことを行います

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- Idendtity template -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="author[not(value = 'ABCD')]"/>

</xsl:stylesheet>
于 2012-11-05T21:34:39.503 に答える